Skip to main content

Full text of "Atari ST 3D Graphics Programming"

See other formats


ATARI 



8 PROGRAMMING 


O 



Concepts and Techniques 


8 


w 

3 

c 

3 






/ ?////* / / 1 1 jjp 


A Data Becker book published by 


m ■ v#u c,n cm "‘ ob ffffffiium r* 

Abacus mm Software 


;ii **>♦♦♦♦« 











































































3-D Graphic 
programming 



By Uwe Braun 


A Data Becker Book 


Published by 

A I I lMWSIIlj) r c - 

Abacus iiiiiiisnl Software 


First Printing, Aug. 1986 
Printed in U.S.A. 

Copyright © 1985 Data Becker GmbH 

Merowingerstr.30 
4000 Dusseldorf, West Germany 
Copyright © 1985 Abacus Software, Inc. 

P.O.Box 7219 
Grand Rapids, MI 49510 

This book is copyrighted. No part of this book may be reproduced, stored 
in a retrieval system, or transmitted in any form or by any means, 
electronic, mechanical, photocopying, recording or otherwise without the 
prior written permission of Abacus Software or Data Becker, GmbH. 

Every effort has been made to insure complete and accurate information 
concerning the material presented in this book. However Abacus Software 
can neither guarantee nor be held legally responsible for any mistakes in 
printing or faulty instructions contained in this book. The authors will 
always appreciate receiving notice of subsequent mistakes. 


ATARI, 520ST, ST, TOS, ST BASIC and ST LOGO are trademarks or 
registered trademarks of Atari Corp. 

GEM is a registered trademark of Digital Research Inc. 


ISBN 


0 - 916439 - 69-0 


Table of Contents 


1. Introduction 3 

2. Mathematical Basis of Graphic Programming 7 

2.1 Moving the Coordinate Base 10 

2.1.1 Scaling the Axis 12 

2.1.2 Rotation around one point 16 

2.2 Plane conversion with matrix operations 19 

2.3 Clipping 26 

2.4 Transformations in three dimensional space 40 

2.4.1 Rotation about any desired axis 36 

2.5 Projection from space to a two dimensional plane 43 

2.6 Perspective transformation 48 

2.7 Hidden lines and hidden surfaces 56 

2.8 Rembrandt and hidden surfaces 65 

3. Machine language fundamentals for graphic 

programming 75 

3.1 Speed Advantages from tables 76 

3.2 Assembler routines for screen manipulation 79 

3.2.1 Drawing lines 80 

3.3 Operating system functions 87 

3.3.1 Starting a program 88 


4. 

Graphics using assembly language routines 

107 

4.1 

Definition of a data structure of an object in 
space 

108 

4.1.1 

Explanation of subroutines used 

152 

4.1.2 

Description of the Subroutines of the first 
Main program 

165 

4.2 

Generation techniques for creating rotating 
objects 

169 

4.1.2 

New subroutines in this program 

188 

4.3 

Hidden line algorithm for convex bodies 

191 

4.3.1 

Explanation of the newly added subroutines 

214 

4.3.1.1 

Errors with non-convex bodies 

215 

4.4 

The painter algorithm 

216 

4.4.1 

New things in the main program rotl.s 

246 

4.4.2 

Sort algorithm 

247 

4.5 

Entering rotation lines with the mouse 

248 

4.5.1 

Description of the new subroutines 

296 

4.6 

Handling several objects 

298 

5. 

Suggestions for additional development 

327 

5.1 

Light and Shadow 

329 

5.2 

Animated Cartoons 

330 


Appendices 


A 

Number systems 

333 

B 

Analytical geometry of the planes and space 

335 

B.l 

Scalar product 

342 

B.2 

Cross product 

342 

C 

Matrix calculations 

344 

C.l 

Adding matrices 

345 

C.2 

Multiplying matrices 

346 

D 

Bibliography 

348 

Index 


349 


L_ 





Abacus Software 


ST 3D Graphics 


1. Introduction 


The possibilities of computer graphics are some of the most challenging 
reasons for working with a computer today. Dazzling computer-generated 
images are showing up almost everywhere--in medicine, engineering, 
motion pictures, music videos, television advertising, and even in 
newspapers like USA Today. The public is fascinated by the unlimited 
forms that computer graphics are taking. Some of the more sophisticated 
of these works are the three-dimensional, computer-animated videos used 
in television advertisements. 

One major application of computer graphics in industry is for CAD 
(Computer-Aided Design) systems. The integration of CAD systems into 
the manufacturing process is of increasing importance. Known as CAD- 
CAM (Computer-Aided Design - Computer-Aided Manufacturing), these 
systems are making significant inroads in automating many of the 
manufactured, assembled, and processed goods such as machine tools, 
automobiles, electronics, and agricultural products. Without advanced 
graphic data processing, the latest medical processes such as CAT scans 
would be difficult, if not impossible. Furthermore, three-dimensional 
graphic data processing has made it possible to visually represent 
complicated scientific relationships and to make them comprehensible 
(like atomic and molecular models and the DNA helix). Eventually these 
graphics will be integrated with advanced teaching and simulation 
methods, and are bound to have a profound impact on the way we think 
and learn. 

The enormous strides made in the production of integrated circuits and 
the increase in processing speeds of relatively new microprocessors such 
as the Motorola MC68000 has made it possible for the home and personal 
computers to enter application areas that were formerly the domain of 
large mainframe computers costing several hundred thousand dollars. 
Even now, an affordable 32-bit personal computer is just around the 
comer. The traditional distinctions between microcomputers, 
minicomputers, and mainframes are becoming increasingly blurred. 

Of course, even the largest mainframes are getting faster as well. The 
fastest computer at this time, the Cray II, has a throughput capacity of 
2000 megaflops (200 million floating-point operations per second). Such 
high computing speeds are needed to closely simulate natural world 
processes with computer models. Examples are the simulation of 


3 


ST 3D Graphics 


Abacus Software 


ecological problems (acid rain), simulation of the human physiology, 
weather prediction, nuclear fusion and fission, origin of the solar system, 
simulation of star systems, space travel, etc. 

This book is intended to explore some of the possibilities of creating two- 
and three-dimensional computer graphics on the Atari ST computer 
series. To obtain a good understanding of the program sections, you 
should have some fundamental knowledge of MC68000 machine 
language. 

Machine language represents the lowest level of communication with the 
computer and contains a small number of rather simple instructions that 
are consequently easy to learn. For the hobbyist, knowing machine 
language programming makes it easier to understand the data structure of 
higher-level languages such as Pascal and C. However, most problems 
and algorithms are easier to program in a higher-level language than in 
machine language. 

For the problem of depicting and representing the 3-D wire models 
presented here, maximum processor speed is crucial. Machine language is 
clearly superior to any higher-level language in fulfilling this 
requirement. With these applications for the Atari ST, real-time three- 
dimensional graphics can be achieved. The removal of hidden lines and 
the shading of areas requires a considerable amount of processor time. 
The Cray II requires 8 minutes to create a single picture with a resolution 
of 2000 by 3000 pixels, with up to 30 bits of color information per picture 
point. In contrast, the ST manages only 640 by 400 pixels and only one 
bit of color information. Of course, it is possible to increase the 
computational capabilities of the ST with programming tricks, fast mass 
storage (hard disk) and large amounts of memory to solve more complex 
graphic problems. 

This book provides you with help in solving the complex programming 
problems of three-dimensional graphics. While the sample programs are 
directly tailored for the Atari ST, the techniques can be used without too 
much difficulty on other computers. Only the routines for hardware 
communication and display control (keyboard input, line drawing, surface 
shading (if possible) and switching between two screens) need to be 
tailored to another computer using an MC68000 CPU (i.e., the Apple 
Macintosh and Commodore’s Amiga). The subroutines for generating 
and handling three-dimensional graphic objects can be run on any 
computer with an MC68000 microprocessor. 


4 





Abacus Software 


ST 3D Graphics 


2. Mathematical Basis of Graphic Programming 


This chapter serves as the mathematical foundation of computer¬ 
generated, three-dimensional graphics. As a result, the explanations are 
very extensive. For this reason we ask readers who are already familiar 
with these topics for a little patience and understanding. 

All computer graphic problems can ultimately be reduced to the problem 
of drawing points on a graphic output device (monitor screen, plotter, or 
printer) and to connect these points with lines. There may also be the task 
of shading the area delineated by the lines. For a demonstration, we will 
use a two-dimensional plane with one Cartesian coordinate system, 
familiar to everybody, whose origin lies in the lower left hand comer of 
the screen. 


Cartesian coordinate system 



T - 1 - 1 - 1 - 1 -r— i r r i i r» 



I ST display coordinate system 


Fig. 2.1: coordinate system and ST display coordinate system 


In Figure 2.1, the first problem of representing graphics becomes clear. 
The Cartesian coordinate system and the display coordinate system used 
by the ST’s software and hardware are not the same. The directions of the 
y-axis are opposite, and the coordinate origin is displaced. Consequently, 


7 


ST 3D Graphics 


Abacus Software 


an object defined in the first system is inverted in the system on the right, 
and is also displaced on the y-axis. 

At first, you might be tempted to define objects to be represented using 
the ST’s coordinate system. But doing this does not solve the second 
problem-that the display surface of every computer is limited. The ST 
can display only 640x400 points at its highest resolution. So, to avoid 
defining objects with these limitations of 640x400 points, we must be 
able to define an object in any desired coordinate system before 
displaying it on the monitor screen. In other words, we must be able to 
scale the object in any of the coordinate systems, i.e., change its size. All 
points of the defined object can then be transformed using graphics 
operations. 

This operation is called windowing. We now introduce three coordinate 
systems. They are: 

1. world coordinate system 

2. view coordinate system 

3. picture coordinate system 

Individual objects are defined in the world coordinate system , where the 
calibration of the coordinate axis may be any desired unit of 
measurement—for example, millimeters, kilometers, years, etc. 

The view coordinate system accepts a portion of the world coordinate 
system. This is similar to an observation window in the world coordinate 
system. 

Finally, the picture coordinate system represents the physical screen 
display of the computer, A single point in this system corresponds to an 
individual pixel on the screen. 

This concept can be explained very simply with an example. Two objects 
are defined in a world coordinate system, the outlines of a house and of a 
church. The two outlines represent all objects that can be depicted on a 
plane. For example, an architect would use the outline of the house in a 
world coordinate system to define individual rooms and furniture. 


Abacus Software 


ST 3D Graphics 


Our task is to transform the observation window, together with the house 
that fills its surface, to the specific picture window for display on the ST’s 
screen. 

Here’s the preferred solution to the problem, using the view coordinate 
system: The origin of the world coordinate system is moved to the lower 
left comer of the observation window and scaled by a suitable factor. It 
now represents all points in the picture coordinate system. If the points 
are in the field of picture coordinates, they can be drawn and connected 
with lines. 


Cartesian coordinate system Screen system for Atan ST 



Fig. 2.2: Transformation of world coordinates to picture coordinates 


9 





ST 3D Graphics 


Abacus Software 


2.1 Moving the coordinate base 


Scaling and (as we shall see later) rotation are both related to the 
coordinate base. To scale an object in relation to another point, or to 
rotate it around an arbitrary point, the coordinate origin must first be 
moved to the relative origin. We can illustrate this again using the house 
example. 



nx 


Fig. 2.1.1 


One way to describe the house is to list the coordinates of the end points 
and to list the points which are connected with lines. For this example, 
the two lists are as follows: 


10 


Abacus Software 


ST 3D Graphics 


End point list: 


Point 

X-coordinate 

Y-coordinate 

PI 

100 

50 


P2 

100 

90 


P3 

120 

130 


P4 

140 

90 


P5 

140 

50 


Connection list: 




Line from 

Point A to 


Point B 

LI: 

PI 


P2 

L2 : 

P2 


P3 

L3: 

P3 


P4 

L4 : 

P4 


P5 

L5: 

P5 


PI 


This description of a polygon, consists of a sequence of closed lines. It 
contains all the information necessary for representing it on the display 
screen. To draw the polygon, the lines’ endpoints are passed to a 
subroutine for drawing. 

As we shall see later, the polygon is also perfectly acceptable for the 
description of complex, three-dimensional objects. Any physical object 
can be closely approximated by chaining various polygons. Also, natural 
asymmetrical bodies such as mountains, forests, lakes and animals can be 
represented in a realistic manner with polygons created through fractional 
geometry, i.e. fractals. In addition, most man-made objects are 
constructed in a symmetrical manner and are easier to represent 
graphically. 

In Figure 2.1.1 the coordinate origin of the world system is moved to 
point P1 [ 10 0,5 0 ] . The new world coordinates (view coordinates) are 
obtained by subtracting the coordinates of point P1— the new origin—from 
the points that define the object. In general, the new world coordinates 
are equal to the old world coordinates, minus the coordinates of the new 
origin (in world coordinates). If we describe the old world coordinate axis 
with x and y, the new world coordinate axis with x' and y', the new 
origin point with NU[nx,ny3 and the point to be moved with 
P1 [ x, y ], we can write: 

Pl[xl',yl'] = Pl[xl,yl] - NU[nx,ny] 


11 



ST 3D Graphics 


Abacus Software 


For example, for point 5—the new origin is located at 
PI (100,50) = NU (100,50). The coordinates of the point to be 
moved P 5 (14 0,5 0) become in the new world coordinate system 
P5x' =140-100 = 40, P5y' =50-50 = 0. The point 
P5 (140,50) becomes point P5' (40,0) . This translation must be 
performed for every point of the object. It is possible to move the origin 
of the world coordinate system to any point. 


2.1.1 Scaling the Axis 


As previously mentioned, scaling the axis refers to the coordinate origin. 
This can be readily seen in Figure 2.1.2. The points of the house, i.e. the 
X and Y coordinates, are scaled by the factor one half in the X and Y 
axes. The result is the halving of the length of the edges, but also a 
translation in the direction of the origin. If we want to avoid displacing 
the direction of the origin, then before scaling the origin must be moved 
to a point not affected by the scaling itself. The Figure 2.1.3 is an 
example. If we want to leave the left lower comer of the house (the point 
PI) in its place. The origin is moved to point PI. The picture is scaled by 
multiplying the X and Y values by one half and finally moving the origin 
to its original location. In this example this means: 

1. Subtract 100 from the X-values of points P1-P5 
Subtract 50 from the Y-values of points P1-P5 

2. Multiply all X- and Y-values of points P1 -P 5 
with the factor one half. 

3. Add 100 to all X-values of points P1-P5 
Add 50 to all Y-values of points P1-P5 


12 


Abacus Software 


ST 3D Graphics 



13 


ST 3D Graphics 


Abacus Software 



Figure 2.1.3 


Scaling with factors greater than one enlarges the object. If we select 
different scaling factors for the X and Y axes, a distorted picture of the 
object results. 

At this point let’s briefly return to the example, at Figure 2.1, and alter 
the scaling factors for converting to view coordinates. With the maximum 
coordinates of the observation: 

[wxmin,wymin]; [wxmax,wymax], 
and the display window 

[vxmin,vymin]; [vxmax,vymax] 
one can give differing scaling factors for the two axes, Sx and Sy. In our 
example: 

Sx=(vxmax-vxmin)/(wxmax-wxmin) 

Sy=(vymax-vymin)/(wymax-wymin) 


14 


Abacus Software 


ST 3D Graphics 


Before scaling, the origin of the world system is moved to the left lower 
comer of the observation window [wxmin, wymin], since this point is 
the data point of the scaling. The result of the conversions is therefore: 

1. Move the origin to the point W1 [wxmin,wymin] by 
subtracting wxmin from all of the X coordinates and 
wymin from all of the Y coordinates. 

2. Multiply all X and Y values of the points with the factor j 

Sx. If the relationship of height to width is equal for hpth c <»•/*'' ‘ oa «UL 
windows, then Sx=Sy. A*}*^ xV r °° 

3. Convert to the display system by multiplying the Y values 
by -I and adding of the maximum Y value to these Y 
values (for the monochrome ST this is 399). This moves 
the origin to the upper left comer of the screen. 

The third step of converting the Y values to the screen display of the ST 
is always the same. During the description we shall limit ourselves to the 
view system. If during subsequent discussions no special reference is 
made to this step, you should remember that if it is not performed, all 
objects appear inverted on the screen after the drawing is completed. 

The location of the picture window in the view system is not fixed to the 
origin, but is movable in the total view system. However, the three 
conversions must be followed by another conversion-moving the 
window to point VI [vxmin,vymin] . Basically the conversion of an 
object is the opposite of the conversion of a coordinate system. Therefore, 
when moving the picture window and the object to the point 
VI [vxmin, vymin] , the coordinates of this point (vxmin and 
vymin) must be added to all object coordinates. 

Summarizing the conversion of the world system into the view system: 

1. Move the origin to the point W1 [wxmin,wymin] by 
subtracting wxmin from all X coordinates, and wymin 
from all Y coordinates. 

2. Multiply all X values of the points by the factor 
Sx=(vxmax-vxmin)/(wxmax-wxmin) , the Y 
values with the factor Sy= (vymax-vymin) / (wymax- 
wymin) . 


15 



ST 3D Graphics 


Abacus Software 


3. Move the window and the object to the point 
VI [vxmin, vymin] by adding vxmin to all X values, 
and vymin to all Y values. 

4. Convert to the display system by multiplying the Y values 
by -1 and adding the maximum Y-value to these Y values 
(for the highest resolution this value is always 399). 


2.1.2 Rotation around one point 


The rotation of an object is related to a single point, just as we found out 
in the previous section on scaling. To start the conversion, a single point 
is rotated around the origin. Since the rotation occurs around the single 
origin point, the data point of the rotation angle is the connecting line 
between coordinate source and the point to be rotated. See Figure 2.1.4. 



The point PI (xl,yl) is moved by rotation around the angle p of the 
origin to the point P2 (x2,y2). We must define the sign of the angles a 
and p as + or Following the conventions of mathematics, we designate 


16 






Abacus Software 


ST 3D Graphics 


the angles as positive when the rotation moves the positive X axis to the 
positive Y axis. Expressed differently, positive angles are measured in the 
counterclockwise direction. For the angle between the connecting line 
from 0,0 to P1 and the X-axis, the relationships are: 

1) SIN(alpha) = Yl/C 

2) COS(alpha) = Xl/C 

3) SIN (alpha+beta)=Y2/C 

4) COS(alpha+beta)=X2/C 

with C=V (X1 2 +Y1 2 ) W (X2 5 +Y2 2 ) . The addition theorems for the 
angle functions SIN and COS are as follow (we won’t derive them here): 

5) SIN(Alpha+Beta)=SIN(Alpha)*COS 
(Beta)+COS(Alpha)*SIN(Beta) 

6) COS(Alpha+Beta)=COS(Alpha)*COS(Beta)- 
SIN(Alpha)*SIN(Beta) 

By combining these equations, X2 and Y2 can be calculated quite easily: 

7) X2/C=COS(Alpha)*C0S(Beta)- 
SIN(Alpha)*SIN(Beta) 

gives us 

8) X2= COS(Alpha)*C* COS (Beta) - 
SIN(Alpha)*C* SIN(Beta) 

from 1) follows 

9) X2=Xl*COS(Beta)-Y1*SIN(Beta) 

10) Y2=Yl*COS(Beta)+X1*SIN (Beta) 


17 


ST 3D Graphics 


Abacus Software 


As an example of rotation, we will rotate the house in Figure 2.1.5 by an 
angle of 30 degrees around the origin. The points P1-P5 become points 
R1-R5, as can be seen on the example at Point PI. 

R1X=P1X*C0S (30)-P1Y*SIN(30) 

R1Y=P1Y*COS(30)+P1X*SIN (30) 

From PI (100,50) follows R1 (61. 6,93.3). According to the same 
principle, the remaining points are likewise converted. 




Figure 2.1.5 


18 


Abacus Software 


ST 3D Graphics 


2.2 Plane conversion with matrix operations 


After learning about the conversions, translations, scaling and rotations 
described in the previous chapter, we are now able to draw on the screen 
any object previously defined in a two dimensional coordinate system, in 
any selected size and viewing angle. One drawback to this method is that 
several arithmetic operations are required for each and every point of the 
object. 

Right now we’ll combine these conversion operations into a single matrix 
operation. (Explanations of matrix operations are found in the Appendix). 
Therefore it becomes possible to apply the conversions to the array and 
then to multiply the resulting array with every point of the object. To 
make the array operations usable for the point coordinates of the plane, 
the point coordinates are first converted to array form. 

There are basically two ways to convert these: with column vectors (2,1), 
or with line vector (1,2) arrays. A conversion array (2,2) is used to 
multiply a line vector with the transformation array, where the 
transformation array must be multiplied with the column vector, (number 
of columns A = number of rows B). 


In this book we shall write the point coordinates as line vectors P and the 
multiply this line vector with the transformation array. This sequence of 
multiplication simplifies, purely subjectively, the creation of the 
transformation matrices. If you multiply a line vector (1,2) with a 
quadratic array (2,2), you will obtain as a result another line vector (1,2), 
which represents point coordinates. The individual point operations can 
be expressed by a suitable transformation matrix T. For scaling the X axis 
by the factor 2, the array S1 is valid. It is also possible to quadruple the Y 
values using transformation array S2. The two scaling steps can be by 
multiplying SI and S2 with array S3. 


Si 2 0 

0 1 


S2 = 1 0 

0 4 


S 3 = S 1 * S 2 = 2 0 

0 1 


★ 


1 0 

0 4 


s 3 



0 

4 


19 


ST 3D Graphics 


Abacus Software 


For rotation, R x is valid for one counter clockwise rotation; from 
trigonometry, a clockwise rotation occurs with r 2 . From Figure 2.1.5, the 
movement of point P1 [ x 1, y 1 ] to point P2[x2,y2], results from 
multiplying P1 with R. 


Rl = cos(b) 

-sin(b) 

sin(b) 
cos(b) 



R -2 = cos(-b) 

sin(-b) 

= cos(b) 

-sin(b) 

-sin {-b 

cos(-b) 

sin(b) 

cos(b) 

P2[X2,Y2] = [XI, 

Yl] * 

cos (30) 
sin(30) 

-sin(30) 
cos (30) 


Several rotations in succession can be carried out by multiplying the 
rotation matrices. Unfortunately, this array form does not permit 
translation (origin relocation). For this you can add a dimension to the 
vectors. Every n-dimensional object can be represented in a (n+1) space 
in innumerable many ways. 

In a three dimensional space there are infinite possibilities for laying out 
the X-Y plane we have just observed. The additional dimension is known 
as Z coordinate of the X-Y plane. For two dimensional objects, its value 
is always one. The X and Y coordinates remain unchanged: the line 
vector [x,y] becomes the line vector [x,y,l]. The array for the translation 
of the source at point D is as follows: 

110 
T = 0 10 

-DX -DY 1 

Every point of the object must be multiplied with this array to move the 
origin of the world coordinate system to the point (DX, DY). For the point 
P [ x, y, 1 ] the result is: new point in world coordinates p' =p*T 

10 0 

P'[x',y',l] = [x,y,1] *010= [x-dx,y-dy,1] 

-DX -DY 1 


20 



Abacus Software 


ST 3D Graphics 


You can combine two displacements by using array multiplications. First 
the origin is moved to the point [DX,DY, 1 ] and then to the point 
[AX, AY, 1 ] of the new coordinate system. The two translation matrices 
Tl and T2 are as follows: 

10 0 10 0 
T 1 =010 T 2 =010 

DX -DY 1 -AX -AY 1 

Multiplication of the matrices results in T 3 : 

10 0 10 0 
t 3 =t 1 *t 2 = 0 1 0 * 0 1 0 

-DX -DY 1 -AX -AY 1 

10 0 

T 3 = 0 1 0 

-DX-AX -DY-AY 1 

P'[x',y',l]= P[x,y,1]*T 3 = [x-DX-AX,Y-DY-AY,1] 

The scaling array S can be defined in the new system: 

SX 0 0 

S = 0 SY 0 and P' = P * S 

0 0 1 

and finally the rotation array R 

cos (a) sin (a) 0 

R(a) = -sin(a) cos (a) 0 

0 0 1 


21 




ST 3D Graphics 


Abacus Software 


Scaling as well as rotation, viewed individually, may be carried out in a 
series through array multiplications. The array multiplication is normally 
not commutative, i.e. Ti * T 2 is not necessarily identical with T 2 * Ti. 
However, the multiplication of the following array types is commutative: 


1) 

Translation 

* 

Translation 

2) 

Scaling 

* 

Scaling 

3) 

Rotation 

* 

Rotation around 
the same axis 

4) 

Scaling 

•k 

Rotating 


Type 4 (scaling and rotating) is only valid when both scale factors 
(Sx, Sy) are identical. 

These fundamentals enable us, through a combination of several array 
operations, to rotate an object around a selected point V[vx,vy,l] 
using a series of several array operations. The various operations are: 

1. Shifting the origin to point V 

2. Rotation around point V by an angle of alpha 

3. Shifting of the origin to the original point 
Three matrices T x , R x and T 2 are required: 



l 

0 


0 


co3(a) 

sin(a) 

0 

Ti - 

0 

1 


0 

Rl = 

-sin (a) 

cos(a) 

0 


-vx 

-vy 


1 


0 

0 

1 


1 

0 

0 






t 2 = 

0 

1 

0 







vx 

vy 

1 







For the multiplication array M 1# the result is: 

Mi = T x * Ri * T 2 and for every point follows: 
P' = P * Mi 


22 


Abacus Software 


ST 3D Graphics 


The sequence of matrices is decisive in these operations and must occur 
from left to right. It is possible however, to first calculate intermediate 
results, but these must be used in the "right" sequence. In this example, 
there are two possible ways to proceed: 

1. First calculate from Z i =T 1 *R 1 and then M 1 =Z 1 *T 2 

2. First calculate from Z 2 =Ri*T 2 and then M 2 =T 1 *Z 2 
The first case is explained in detail. Z 1 =T 1 *R 1 : 


0 0 

cos(a) 

sin(a) 0 


1 0 * 

-sin(a) 

cos (a) 0 


-vy 1 

0 

0 1 


cos (a) 


sin(a) 

0 

-sin(a) 


cos(a) 

0 

cos(a)+vy*sin(a) 

-vx*sin(a)-vy*cos(a) 

1 


and now M i =z 1 *T 2 : 

cos(a) sin(a) 

M x = -sin(a) cos(a) 

-vx*cos(a)+vy*sin(a) -vx*sin(a)-vy*cos(a) 


0 

0 * 
1 


10 0 
0 1 0 = 

vx vy 1 

sin(a) 0 

cos(a) 0 

vx*sin(a)-vy*cos(a)+vy 1 


cos(a) 

-sin(a) 

-vx*cos(a)+vy*sin(a)+vx 


23 


ST 3D Graphics 


Abacus Software 


If point PI [x, y, 1 ] is multiplied with this array, the result is point 
PI' [x' , y' , 1], the point PI which was rotated around the angle 
alpha at point VI [vx, vy, 1]. This connection can be recognized in 
Figure 2.2.1 and should be performed as example for point PI. 
PI [x, y, 1 ] * Ml = 


cos (a) sin (a) 0 

[x,y,l] * -sin (a) cos (a) 0 

—vx*cos(a)+vy*sin(a)+vx -vx*sin(a)-vy*cos(a)+vy 1 

Pl[x,y,z]= f[x*cos(a)-y*sin(a) -vx*cos (a) +vy*sin (a) +vx] , 

[x*sin(a)+y*cos(a)-vx*sin(a)-vy*cos(a) +vy], [1] ] 

You can see that when the rotation point and the point to be rotated are 
identical, therefore x=vx and y=vy, the expression for the line vector of 
the point at [ vx, vy, 1 ] = [ x, y, 1 ] degenerates. That means that the 
point coordinates do not change. 



24 





Abacus Software 


ST 3D Graphics 


The house already familiar in Figure 2.2.1 shall be rotated by the angle 
alpha=30 degrees around the point VI [ vx, vy, 1 ] = [ 12 0,8 0, 1 ]. As 
an example this is carried out on point P2[100,90,l]. 


P2x'=100*cos(30)-90*sin(30)-120*cos(30)+80*sin(a)+120 

P2y'=100*sin(30)+90*cos(30)-120*sin(30)-80*cos (30)+80 

P2'=[97.68,78.66,l] and finally for the remaining points P1-P5. 

PI'=[117.68,44.02,1] 

P2'=[97.68,78.66,1] 

P3'=[95,123.30,1] 

P4'=[132,32,98,66,l] 

P5'=[143.66,59.02,1] 

This procedure also permits you to change the point for scaling to any 
location in the coordinate system. In the following, you can see the 
buildup of the transformation array. First the coordinate origin is moved 
to point K1 [ kx,ky,1] with translation array T 1? then scaling with array 
Si, using scaling factor Sx and Sy, and finally moving the origin to its 
original location using translation array T 2 . For every single point this 
means p' [x' ,y', 1] = p [x,y, 1] *T 1 *S 1 *T 2 . 



-kx 


0 0 

1 0 

-ky 1 


Sx 

Si- 0 
0 


0 0 

Sy 0 
0 1 


1 

t 2 = 0 

kx 


0 0 

1 0 
ky 1 


Sx 0 0 

T-l* Si* T 2 = 0 Sy 0 

kx*(l-Sx) ky*(1-Sy) 1 

P'[x,y,1] =P'[x*Sx+kx(1-Sx),y*Sy+ky(1-Sy),1] 

In this example Sx=Sy=0.5. 


25 



ST 3D Graphics 


Abacus Software 


2.3 Clipping 


As we transformed the object coordinates to the display coordinate 
system, we assumed that all points in the object can be represented in the 
picture coordinate system. When we define a window in the world 
system, some objects may be completely pushed out of the view of the 
window, or objects are cut in half by the window. This means that one or 
several connecting lines of the points cut the comers of the observation 
window. 





Figure 2.3.1 


To avoid these incomplete objects, we can test the coordinates to make 
sure they lie within the borders of the window. This method slows down 
the drawing procedures considerably. Therefore it is better to determine 
before drawing a line if the line is completely visible, partially visible, or 
not visible at all. The window is surrounded by eight equally large 
surfaces to determine the exact position of the line to the window. Now 
the exact location of a line can be determined by comparing its 


26 











Abacus Software 


ST 3D Graphics 


coordinates to the window borders. A code containing four bits can be 
used to represent the relative position of a line outside of the window. 



Bit number 3 210 

Figure 2.3.2:CIip-Window 

In the Figure 2.3.2 the position of a point outside a window is repeated by 
a set bit as follows: 

bit position 

0 = Point is left of the window 

1 = Point is right of the window 

2 = Point is below the window 

3 = Point is above the window 


27 






ST 3D Graphics 


Abacus Software 


The code [0,1,0,1] means the following: the point is to the left and below 
the window. With this information, it is possible to calculate the points of 
intersection of the lines with the window edges by including them in the 
equation. This leads to a quadratic equation system whose solution 
requires several multiplications and divisions. For our purposes, we want 
to limit the number of multiplications and to replace them when possible 
with other mathematical operations. We do this for two reasons. The first 
is for speed since multiplication requires about eight to ten times the 
calculation time of addition. The second is the fact that the result of 
multiplication, with the same number of significant positions of the 
operands, has a larger relative error. 

To get an optimal solution of the line-clipping problem requires a 
programming language which permits bit manipulation. This was 
developed by Cohen and Sutherland. Since the efficiency of the Cohen- 
Sutherland clipping algorithm is so great, it is sometimes implemented in 
the hardware of some graphic terminals. 

The starting point of the algorithm is to divide the plane into the nine 
areas previously illustrated. For every line which is to be "clipped”, you 
must determine a center point and on the basis of its position relative to 
the window. 

The calculation of the center point of a line AB is simple. Just add the X 
and Y coordinates of the end points and divide them by two. 
Mx= (ax+bx) /2, My= (ay+by) /2. Division by two is performed by 
microcomputers easily by a single right shift and this explains the speed 
of the algorithm. 

The 8 different positions of the end points relative to the window are 
illustrated in Figure 2.3.2. Before calling the clip-routine, you must first 
test to see if the two end points are visible. If any of the bits are set, then 
some portion of the line is not visible. In Figure 2.3.2 both A and B are 
above the upper window edge, and therefore the line AB is not visible and 
no longer needs to be considered. You can calculate the position of the 
points by "ANDing" their codes and then testing for a "not zero” 
condition. For lines which have no common position parameter, for 
example the line CD, positions are determined with two separate 
procedures. First the right and then the left intersecting points with the 
clip-window. 


28 


Abacus Software 


ST 3D Graphics 


First calculate the midpoint Ml of line CD. After determining the position 
code of the point Ml, it is compared with the code of the right endpoint D. 
If a single bit of these codes is the same, then the partial line MID does 
not have to be considered further, and the right endpoint D is replaced 
with the point Ml which was just determined. Now the midpoint of line 
CM1 (M2) , is calculated and tested again with the right endpoint, this 
time Ml. If both points are not on one side, M2 becomes the new left 
endpoint and the right endpoint remains Ml. Next search the midpoint of 
the line M2M1. This procedure is continued until a new calculated 
midpoint is equal to one of the two end points used for calculation. 

After completing the algorithm, the last left endpoint is the desired 
intersecting point with the window. The intersecting point is stored and 
the two starting points C and D are interchanged. With the same 
procedure the intersection with the left window edge is determined. At 
the start of the routine, if you find that an endpoint is already inside the 
window, this endpoint must be stored. The line ST causes a problem. The 
two end points S and T are not on the same window side and the line does 
not intersect the window. A comparison of the first center point T1 shows 
it matching both end points. The points T1 and T are both to the right of 
the window and point S below the window. You can thus define a new 
ending criteria--# a new midpoint lies outside of the window and matches 
both end points of the line, then the line is not visible. 


29 


ST 3D Graphics 


Abacus Software 


2.4 Transformations in three dimensional space 


A small warning before we start: Thinking in three dimensions requires a 
period of adjustment for the non-mathematically oriented reader. It may 
be necessary to read this chapter several times before the concepts can be 
fully understood. 

Starting with the two dimensional X-Y-coordinate system, there are two 
ways to introduce a right angle coordinate system to describe three 
dimensional space. They are the right-hand and the left-hand coordinate 
system which differ only in the orientation of the negative Z axis. 



A coordinate system is called a right-hand coordinate system when a 
screw with a right-handed thread (a normal wood screw) moves in the 
direction of the positive Z axis when it is turned from the positive X axis 
in the direction of the positive Y axis. See Figure 2.4.2. The right-hand 
coordinate system is used extensively in mathematics while some 
computer graphic books select the left-hand coordinate system. 


30 


Abacus Software 


ST 3D Graphics 


Mathematical problems can be solved in either system and one system 
can easily be turned into the other. We shall use both systems. The 
transformations in three dimensional space will be explained on a right- 
hand coordinate system, the perspective transformations on a left-hand 
coordinate system. 


z z 



Right-hand Left-hand 


Figure 2.4.2 


All operations in a two dimensional space are special cases of 
corresponding operations in three dimensional space. In the extended 
coordinate system, the line vector of a point is expressed as: 
P [x,y, z, 1]. To move the origin to the point V[vx,vy, vz, 1], use 
the matrix T1: 


T i = 


1 

0 

0 

•vx 


0 

1 

0 

■vy 


0 

0 

1 

-vz 


0 

0 

0 

1 


So for every point: [x,y,z,l] * Ti = [x-vx,y-vy,z-vz,1] 


31 


ST 3D Graphics 


Abacus Software 


The scaling matrix is similar. A scaling factor for the Z axis (Sz) is 
added: 

Sx 0 0 0 

S 1 = 0 Sy 0 0 

0 0 Sz 0 

0 0 0 1 

For every point: [x, y, z, 1] * = [x*Sx, y*Sy, z*Sz, 1 ] 

Rotation is limited to the three rotation axis: X,Y, and Z. We are already 
familiar with rotation about the Z axis from the earlier 2D description. 
The 3D description is derived by assuming that the positive Z axis 
projects from the drawing surface. The coordinates of the axis about 
which rotation takes place, does not change, in this case the Z coordinates 
retain their values. 

cos(zw) sin(zw) 0 0 

R z = -sin(zw) cos (zw) 0 0 

0 0 10 

0 0 0 1 


32 


Abacus Software 


ST 3D Graphics 



Figure 2.4.3 


We must also allow for setting a positive turning angle for the rotation 
about the X and Y axes. A solution which can be applied to both the left- 
hand and right-hand coordinate systems uses the following definitions: 

Rotation axis positive angles are measured from 


Z-axis 

X- to Y-axis 

Y-axis 

Z- to X-axis 

X-axis 

Y- to Z-axis 


From this follow the matrices for rotation around the X and Y axis R x and 

Ry. 


33 


ST 3D Graphics 


Abacus Software 


10 0 0 
R x = 0 cos(xw) sin(xw) 0 
0 -sin(xw) cos(xw) 0 
0 0 0 1 

cos(yw) 0 -sin(yw) 0 

R y = 0 10 0 

sin(yw) 0 cos(yw) 0 
0 0 0 1 

For the coordinate system this means that if you look from a positive axis 
in the direction of the coordinate origin, a positive angle describes a 
counterclockwise rotation. In a left-hand coordinate system a positive 
angle describes a rotation in the clockwise direction. This definition 
applies to a fixed coordinate system in which the objects are rotated. The 
other type of representation would be the fixed placement of the object 
and the rotation of the coordinate system. The two types differ only in the 
sign of the rotation angles. This means that if the object is rotated about 
the angle alpha, or the coordinate system is rotated about angle alpha, 
the result in both cases will be the same. In three dimensional space the 
point of the rotation, as in the two dimensional plane, is the origin. If you 
want to rotate an object around another point, it is first necessary to move 
the origin to that point. The required steps are: 

1. Change the origin to the point B[bx,by,bz, 1] using 
translation matrix Ti. 

2. Rotate around the Z axis with rotation matrix R x . 

3. Retranslate the origin using translation matrix T 2 

10 00 cos(a) -sin(a) 0 0 

T]_= 0 1 0 0 Rl= -sin (a) cos (a) 0 0 

0010 0 0 10 

-bx -by -bz 1 0 0 01 

10 0 0 
T 2 = 0 1 0 0 

0 0 10 

bx by bz 1 


34 



Abacus Software 


ST 3D Graphics 



Figure 2.4.4 


Let’s assume that you want to rotate an object about around all three 
axes. It is then possible to combine the rotation matrices R x , Ry and R z 
by multiplying with Rg. In contrast with the combination of rotations 
about the same axis in this example the sequence of multiplications is 
important, i.e. R x *Ry*Rz yields a result different from R z *Ry*R x . A 
point with a positive Z value is rotated 90 degrees around both the Z and 
X axes. If the rotation is first made about the Z axis, the coordinates do 
not change, X- and Y-coordinates are equal to zero, and the subsequent 
rotation about the X axis rotates the point to the Z=0 level; which is the 
X-Y plane. 

If the first rotation is about the X axis, the point is transferred to the Z=0 
level and the subsequent rotation about the Z axis rotates the point into 
the Y=0 level, which is the level between the X and Z axes. This example 
shows why it is necessary to follow the sequence of rotations during 
program generation. 


35 


ST 3D Graphics 


Abacus Software 



2.4.1 Rotation about any desired axis 


Up to now we have only considered rotation about one of the coordinate 
axes; with suitable combinations of various transformations we can turn 
an object around any desired line in space. Two points Pl[xl,yl,zl] 
and P2 [x2,y2, z2] are sufficient to describe a point in space. The 
equation through these two points: 

x = xl + t*(x2-xl) 

y = yl + t*(y2-yl) with t elements from R 
z = zl + t*(z2-zl) 


36 







Abacus Software 


ST 3D Graphics 



Since the problem for rotation about one coordinate axis has already been 
solved, we want to transform a rotation axis in such a way that it will 
coincide with the negative Z axis. The sequence of the transformation 
looks like this: 

Displacement of the coordinate origin to the point 
PI [xl, yl, zl] on the line. 

Rotation about the angle xw on the X axis, so that the 
rotation axis lies in the X-Z plane. 

Rotation of the angle y w about the Y-axis until the rotation 
axis coincides with the negative Z axis. 

It is now possible to rotate the desired angle zw about the Z axis since it 
matches the rotation axis. If one looks from PI to P2 a positive angle 
will rotate an object in a counterclockwise direction. 


37 





ST 3D Graphics 


Abacus Software 


To transform back to the original we need: 

Rotation of the angle -yw around the Y axis 


Rotation of the angle -xw around the X axis 

Displacement of the coordinate origin at the starting point. 

The only problem is the determination of the angles xw, yw, which can be 
derived from the equation. As in Figure 2.4.7 we imagine that the 
coordinate origin is already moved to point P1. Then the coordinates of 
the point P2' [x2-xl,y2-yl, z2-zl] represent the direction vector 
of the lines. This vector is now projected on the Y-Z plane, whereby the 
term projection should be taken literally. In addition you should imagine 
the vector G [gx, gy, gz] = G [x2-xl, y2-yl, z2-zl] illuminated 
by light rays, parallel to the X axis and originating from the positive X 
axis. The shadow created in the Y-Z plane is the vector L [0, gy, gz] 
and the angle alpha between vector L and the positive axis Z is the 
desired angle xw. 


In a rotation about the X axis, a positive angle describes the rotation of a 
point from the positive Y axis in the direction of the positive Z axis. The 
angle alpha is positive and the rotation matrix is as follows: 


R 


x 


10 0 
0 cos(a) sin (a) 
0 -sin(a) cos (a) 

0 0 0 


0 

0 

0 

1 


38 


Abacus Software ST 3D Graphics 



sin(a) = gy/1 and cos (a) = gz/1 


For the rotation matrix R x this means: 

1 0 0 0 

r x — 0 gz/l gy/i 0 

0 -gy/l gz/1 0 
0 0 0 1 

After this transformation, the vector G (P IP 2) lies in the plane located 
between the positive Y and positive X axis. The angle gamma, which we 
defined to be positive, is the desired angle (yw), which rotates the vector 
G with one rotation about the Y axis on the negative Z axis. The rotation 
matrix Ry: 


39 













ST 3D Graphics 


Abacus Software 



cos (g) 0 

0 1 

sin(g) 0 

0 0 


-sin(g) 0 

0 0 

cos (g) 0 

0 1 



It is possible to divide the angle gamma into the partial angles beta and 
the right angle alpha’ (90 degrees), between the positive X and negative Z 
axes. Through rotation about the X axis the X coordinate of the point P2 
has not changed, whereas the Y c oordinate has beco me zero. The sum of 
the vecto r G [gx, gy, gz ] g =V~ (gx 2 +gy 2 +gz ^) is therefo re identical 
to g =V" (gx^+z l z ) . From this follows z ' =V” [g z -gx 2 ) and from 
1 =V (gy 2 +gz 2 ) = V (g 2 -gx 2 ) results in z ' : z' = 1. 

For the angle beta the following relationships result: 

sin(b) = 1/g and cos (b) = gx/g 

The rotation angle gamma is composed of beta plus 90 degrees, 
ga - b + 90 


40 


Abacus Software 


ST 3D Graphics 


From tlffe addition theorems for sine and cosine we get: 

sin <ga)=sin(b+90)=sin(b)*cos(90))+sin(90)*cos(b) 

sin(ga) = sin (b+90) = cos(b) 

cos(ga)=cos(b+90)=cos(b)*cos(90)-sin(90)*sin(b) 
cos (ga) = cos (b+90) = -sin(b) 

Since the rotation angle is measured positive, it is possible to include the 
information just acquired directly into the rotation matrix. 


-sin(b) 0 

0 1 

cos (b) 0 

0 0 


-cos(b) 0 

0 0 

-sin(b) 0 

0 1 


with the references to the angle functions: 



-1/g 0 -gx/g 0 

0 10 0 
gx/g 0 -1/g 0 

0 0 0 1 


After these preparatory transformations, the rotation takes place about the 
desired angle za about the rotation axis, which is the connecting line 
between PI to P2. The matrix for this is: 


cos(zw) sin(zw) 0 0 

Rz =- sin(zw) cos(zw) 0 0 

0 0 10 

0 0 0 1 


41 


ST 3D Graphics 


Abacus Software 


The inverse transformation matrices: 

The transformations for one point 

-1/g 0 gx/g 0 

Ry -1 =0 1 0 0 

-gx/g 0 -1/g 0 

0 0 0 1 

10 0 0 

R x 1 = 0 gz/1 -gy/1 0 

0 gy/l gz/1 0 

0 0 0 1 

10 0 0 

T -1 =0100 
0 0 10 
xl yl zl 1 

P'[x',y', z',l]=[x,y, z, 1]*T*R x *R y *R z *R y -1 *R x -1 *T~ 1 

In these cases the rotation matrices R x etc. are combined through 
multiplication. The translations are performed separately. 


42 


Abacus Software 


ST 3D Graphics 


2.5 Projections from space to a two dimensional plane 


A window can be made for observation in 3D space just as it can on a 
2-dimensional plane. The position of the window and its orientation 
relative to the world system is purely arbitrary. For definition of this 
observation window you should imagine a second coordinate system, the 
view system inside the world system. Its origin lies in the left comer of 
the observation window. 



As a position parameter which describes the position of the view system 
relative to the world system, the two points ORP (Observation reference 
point) and ODP (Observation direction point) are sufficient, both of 
which are defined in the world coordinate system, as well as perhaps an 
inclination angle between positive Y and positive V axis (za), which 
describes a rotation of the U-V plane about the Z axis. The view system, 
as illustrated in Figure 2.5.1 is a left system. The orientation of the 
positive Z axis is opposite to the world coordinate system. 


43 





ST 3D Graphics 


Abacus Software 


For clarification: Every scene defined in the world coordinate system, 
such as an airport for a flight simulator, can be viewed from any point 
inside this scene. The only parameters required are the observation 
reference point (ORP), which in comparison with a camera, would 
represent the film, and the observation direction point (ODP), which 
determines the direction in which the observer (the camera) is looking. 
The additional angle used (za) between positive Y and positive V axes 
describes a rotation of the camera about the longitudinal axis of the 
objective. The focal point of the lens at which all light rays passing the 
objective meet, would in this example be on the negative Z axis. Keeping 
to the example of the camera, exposing a picture must transform the 
entire scene into the view system (U-V-Z’). 

This transformation, which appears complicated at first glance, has 
already been solved: it is the rotation about an arbitrary axis. The points 
PI and P2 of the axis of rotation are replaced by the points ORP and ODP 
and the angle za describes the inclination of the V axis to the Y axis. All 
operations relate to the observation reference point 
(ORP [orx, ory, orz] ), the positive axis of the observation coordinate 
system (view-system) points to the observation direction point 
(ODP [odx, ody, odz]). Both points are described in world coordinates 
and the rotation matrix rotates the vector G[odx-orx, ody-ory, odz- 
orz] to the negative Z axis of the world coordinate system. After fitting 
the V axis, the object, which was subjected to the same operations, is 
available in the view coordinates. Not quite, though, since the two 
coordinate systems still differ in the orientation of the Z axis. Therefore 
after fitting the V axis, all Z values must be multiplied by the factor -1 
which corrects the orientation of the Z axis. The last step is a 
mathematical cosmetic which is required only because of the starting 
model of the positive Z axis of the left-hand coordinate system. If one 
views the result of the transformation as a right-hand system, the last step 
can be omitted. 

Let us combine the steps again, considering the steps necessary for 
rotation around any desired axis. 


44 



ST 3D Graphics 


Abacus Software 


1. Shifting the origin to the observation reference point ORP 
via the translation matrix Tj. 



1 

0 

0 

-orx 


0 0 0 

1 0 0 

0 10 
-ory -orz 1 


2. Rotation around the X axis until the vector G[odx- 
orx, ody-ory, odz-orz] = [gx / gy,gz] lies in the 
Y-Z-plane. 


10 0 

R x = 0 gz/i gy/i 
0 -gy/i gz/i 

0 0 0 


with 1 = V(gy2+gz 2 ) 


0 

0 

0 

1 


3. Rotation about the Y axis until the vector G[gx, 0, z'] 
meets with the Z axis: 



-1/g 0 -gx/g 0 

0 10 0 
gx/g 0 -1/g 0 

0 0 0 1 

with g = V (gx 2 +gy 2 +gz 2 ) 

l = V7gy 2 +gz 2 ) 

z' = 1 


4. Rotation of the Z axis around the za angle for adaptation 
of the inclination of the V axis: 


R 


z 


cos(zw) 
-sin(zw) 
0 
0 


sin(zw) 0 0 

cos(zw) 0 0 

0 10 

0 0 1 


46 


Abacus Software 


ST 3D Graphics 


5. Multiplication of the Z coordinates with -1 to convert from 
the right-hand to the left-hand coordinate system. 


Mi 


10 0 0 

0 10 0 

0 0-10 
0 0 0 1 


The object now lies in the left-hand coordinate system U-V-Z’ and can be 
projected on the display, the plane suspended between the U and V axis 
via a suitable perspective transformation. 


47 


ST 3D Graphics 


Abacus Software 


2.6 Perspective transformation 


Since the representation of objects on the screen is limited to two 
dimensions, we have to simulate the third dimension, the Z coordinate, in 
the two-dimensional plane. The method we used, the central projection, 
defines a point in space (the focal point of a lens) at which visual rays 
emanating from the object meet. The size of the objects represented on 
the display screen is directly proportional to their distance from this focal 
point. Equal size objects which are farther away are shown smaller than 
objects which are closer to the observer. 






T 


l i 


*z 


Figure 2.6.1: Perspective 


The coordinate system from Figure 2.6.1 is, as already indicated, another 
coordinate system and the plane suspended between the positive U and 
the positive V axis at point z’=0 will represent the screen. The center of 
the projection (focal point) is located on the negative Z axis at point 
PROZ[prozx, prozy, prozz ' ] = [0, 0, prozz' ]. The position of the 
point tc be viewed P[pu,pv,pz], appears to be located behind the 


48 







Abacus Software 


ST 3D Graphics 


observation plane. The line through these two points is described by the 
following equation: 

u = plu + (prozu-plu)*t 

v = plv + (prozv-plv)*t 

z' = plz' + (prozz' -plz') *t = 0 , the plane 

lies at z'=0 => 

t “ -plz'/(prozz'-plz') 

u = plu - (prou-plu)*plz'/(prozz'-plz') 
v = plv - (prozv-plv)*plz'/(prozz'-plz') 
z' =0 

with prozu=prozv=0: 
u = plu + plu*plz'/(prozz'-plz') 
v = plv + plv*plz'/(prozz'-plz') 
z = 0 

Since prozz' is negative and plz' is positive, the denominator 
(prozz' -plz') becomes negative, and with larger distances between 
focal point PROZ and point PI, the point coordinates (in the projection 
plane) plu' or plv' become smaller. We are now in the position to 
project a three-dimensional representation of the object on the screen and 
the distance of the projection-center object is comparable to the focal 
length of a camera lens. A short length corresponds to a wide-angle lens 
and a larger distance to a telephoto lens. The projections described are 
valid for the special case of the projection plane at the point z' = 0. The 
project plane can be moved freely on the z’ axis and can be behind the 
object or also behind the eye. 


49 


ST 3D Graphics 


Abacus Software 



In this illustration the projection center is at the point PROZ, while the 
object to be projected is the connecting line between the points PI P2. 
d designates the location of the projection plane on the Z’-axis, which 
can be moved arbitrarily in either direction. If the projection center and 
projection plane (d=PROZ) match, all objects degenerate to a single 
point, the center of the projection. The size of the projection can be 
changed by moving the projection plane. For the line between projection 
center PROZ and object point P1 the two point equation holds: 

u = plu + (prozu-plu)*t 

v = plv + (prozv-plv)*t 

z' = plz' + (prozz'-plz')*t = d 


50 



Abacus Software 


ST 3D Graphics 


The Z’-coordinate of the projection plane is d, and from the equation for 
the Z’-coordinate it follows: 

t = (d-plz' ) / (prozz' -plz' ) inserted into the linear equation 
results in the projection coordinates: 

u' = plx + [(prozu-plu) * (d-plz')] / (prozz'-plz') 
v' = p1v + [ (prozv-plv) * (d-plz')] / (prozz'-plz') 
z' = d 

Every point P[u,v,z',l] is transformed into the display coordinates P 
' [u',v',d,l]. The coordinates u' and v' represent a point on the 
screen. 

The equation derived from Figure 2.6.1 comes from the special case 
where the projection center lies on the Z axis prozu=prozv=0 and 
when the projection plane is on the z'=0 plane, d=0. The following 
illustrations show how the selection of the various observation parameters 
(ORP, PROZ, d) influence the appearance of the projection. The 
coordinate origin of the display is in the lower left comer of the screen. 


51 




ST 3D Graphics 


Abacus Software 



• projection center 


Figure 2.6.3 


52 






Abacus Software 


+ Z 


ST 3D Graphics 


resulting projection 









Figure 2.6.5 


54 






Figure 2.6.6 






ST 3D Graphics 


Abacus Software 


2.7 Hidden lines and hidden surfaces 


Up to now we have been in the position to project wire models of objects 
on the screen. The action sequence of most any computer animation is set 
up with the help of 3-D wire models. Wire models can be handled in real¬ 
time and thus shorten the development of the animation sequence 
considerably. Once the sequence is set, the computer calculates the 
visible surface and color nuances and light reflections of the objects for 
every intermediate point of the movement, according to the illumination. 
Generally the scan line algorithm is used. Seen from the eye, the vision 
rays are tracked through each pixel of the display (= projection plane) to 
the individual objects. The visual ray is either reflected, absorbed, or 
wholly or partially transmitted by various objects with differing surface 
characteristics. Under certain conditions the visual ray splits, such as on a 
glass surface, into a reflected and a second visual ray which passes 
through the object, naturally both must be tracked. This explains the 
computation time of about 10 minutes which even super-computers like 
the Cray II require for a picture. 

Since by conservative estimate the throughput of the Cray II is superior to 
that of the Atari ST by a factor of about 10,000 to 15,000, it should be 
clear that the ST is somewhat “under powered" for such calculations. 
Therefore we will limit ourselves to the “surface algorithms" and will not 
determine the visibility of every point, but just for each surface of the 
object. These algorithms are fast. To be accurate, they are valid only tor 
convex bodies, and in the version presented here the surfaces of the 
bodies must also be convex. 


56 


Abacus Software 


ST 3D Graphics 



Figure 2.7.1: Convex and Concave Surfaces 


With convex polygons the line connecting two points on the polygon lies 
within the polygon, whereas in convex bodies the connecting line 
between two points on the surface passes through the body or runs along 
the surface. Formulated differently, convex polygons have at least one 
inner angle which is larger than 180 degrees. 

For these surface algorithms we must expand the object definition, which 
up to now consisted of the point and line list, to include a surface list. The 
surface list contains a description of each surface by the lines which 
border the surface. 


57 














ST 3D Graphics 


Abacus Software 



The two surfaces I and II would be described in the surface list as 
follows: 


Surface Line from point to point 

I Pl,P4 P4,P3 P3,P2 P2, Pi 

II P5,P6 P6,P7 P7,P8 P8, PI 

You probably noticed that the line direction is reversed in the description 
of the surfaces. The line vectors of surface I describe the surface as seen 
from the negative Z axis in a clockwise direction, while surface 11 is 
described in a counterclockwise direction. This small difference contains 
the solution to the hidden-line-problem. If you imagine the surfaces I and 
II as outer surfaces of a block, then SI is the front surface and SI I the 
rear surface of the block. The observation point is still on the negative Z 
axis. SI I is not visible from the observation point since it is hidden by 
the other surfaces. 


58 














Abacus Software 


ST 3D Graphics 


You can see that the description of the surface is always done in the 
clockwise direction from outside the cube and looking toward the current 
surface center. For the definition of the surface one wanders around the 
object to be described and determines the direction of the connection 
lines of the points belonging to the surface. As one can see in the next 
illustration, the visibility of the surfaces can be determined through the 
direction of the connection lines with a little vector algebra. 

To do this, start from any point on the surface and form the vector to the 
next point 

P= [px,py,pz] = [p2x-plx,p2y-ply,p2z-plz] , 
and the vector to the next point 

Q [qx, qy, qz] = [p3x-plx, p3y-ply, p3z-plz ], 

as well as the projection vector from a point on the surface to observation 
point A. An appropriate selection is the point 

PI,S[sx,sy,sz] = [ax-plx,ay-ply,az-plz]. 

As explained in the appendix, the product of two vectors (a\b) (see 
App. B) forms a vertical vector 

R= [rx, ry, rz ] =[py*qz-pz*qy,pz*qx-px*qz,px*qy- 
py*qx]. 

The direction of this vector results from the system in which the vector 
product was performed. In the left coordinate system used here, the 
vector d points in the same direction in which a screw with a left-handed 
thread would move from P to Q when turned, that is, it points with 
surface I in the direction of the positive Z axis and with surface II in the 
direction of the negative Z axis. 

Now we can say this about the visibility of surface I: if the vectors S and 
R are pointing in the same direction, the surface is visible from the 
observation point. If the vectors S and R point in different directions, the 
surface is not visible. As mentioned earlier, this process is limited to 
closed convex bodies, but the error is not very large with concave bodies. 


59 


ST 3D Graphics 


Abacus Software 


Figure 2.7.3-4: Hardcopy of bodies before and after 
Hidden-Line-Algorithm 



60 




Abacus Software 


ST 3D Graphics 



Figure 2.7.5 
61 





ST 3D Graphics 


Abacus Software 



Figure 2.7.6 



Figure 2.7.7 

62 




Abacus Software 


ST 3D Graphics 


The error with concave bodies is that surfaces which are visible from the 
observation point are hidden by other surfaces but are not recognized. 
Now only the "direction comparison criterium" between two vectors is 
missing. This is accomplished by the scalar product of two vectors 
(S *R) which is defined as follows: 

c = |SI * IRI*cos(Phi) = sx*rx+sy*ry+sz*rz 



cos(alpha) > 0 



Figure 2.7.8 


c is a real number and phi is the angle enclosed by S and R. From 
Figure 2.7.8 we can see that the vectors a and b point in the same 
direction when cos (phi) is positive. The recognition of hidden 
surfaces can be summarized as follows. 

1. Creation of a surface list in which the points are listed in a 
clockwise direction. 

2. Finding the vectors P and Q from three successive points 
for each surface. 


63 



ST 3D Graphics 


Abacus Software 


3. Determination of the vector S [sx, sy, sz ] from a point 
on the surface to the observation point. 

4. Determination of the vector perpendicular to P and Q 
R [rx, ry, rz ] through the vector product (P\Q). 

5. Comparison of the direction of the vectors S and R by 
checking the sign of the scalar product (S*R) through 
multiplication of the single components from S and R 
(Scalar product = sx*rx+sy*ry+sz*rz) 

6. Marking of surfaces which have positive scalar products as 
visible surfaces. (Applies to left coordinate systems. In 
right coordinate systems the surfaces with negative scalar 
products are visible surfaces.) 

7. Drawing the visible surfaces. 


64 


Abacus Software 


ST 3D Graphics 


2.8 Rembrandt and hidden surfaces 


You probably want to know what computer graphics and a painter who 
died in 1669 have in common. An oil painting is created from back to the 
front, that is to say, the painter first draws the background and then 
objects are placed further to the front simply by covering the background 
with oil paint. This method, carried over to the computer, is another 
solution of the hidden surface problem. A middle Z coordinate is 
calculated for each surface and, as an example, all Z coordinates of the 
comer points can be added and divided by the number of comer points 
which are stored for the surface. Then the surfaces are sorted according to 
size and drawn from the largest to the smallest Z coordinates. 

To insure that the surfaces which are painted over have really been 
covered, we can’t just to draw the outer lines of the surface. It is 
necessary to fill the surfaces with color. The surface construction from 
the back to the front is shown in the following illustrations. 

Figures 2.8.1-5: Hardcopy of the surface construction 



Figure 2.8.1 


65 






ST 3D Graphics 


Abacus Software 


Figure 2.8.2 


Figure 2.8.3 


66 


Abacus Software 


ST 3D Graphics 









ST 3D Graphics 


Abacus Software 



Figure 2.8.6 



Figure 2.8.7 


68 


Abacus Software 


ST 3D Graphics 



Figure 2.8.8 


Of course, the two methods for the removal of hidden surfaces can be 
combined. First the visible surfaces can be determined through scalar 
products. Followed by sorting the surfaces according to descending Z 
coordinates, and then drawing them. 


69 







ST 3D Graphics 


Abacus Software 


2.8.1 Light and Shadow 


In general, there are two types of illumination, direct and indirect. With 
indirect illumination the intensity of the light is equal on all places in 
space. The indirect light is created through diffuse reflection from other 
objects, such as walls and ceilings. The appearance of an object in space 
under this illumination is dependent only on the reflection coefficient of 
the object. This reflection coefficient is the relationship of reflected light 
rays to the total striking the surface. Its value runs from zero for a black 
body (all light rays which strike are absorbed) and one for a white body 
(all light rays which strike are reflected). A body whose reflection 
coefficients are between zero and one is designated as a gray body. A 
reflection coefficient R can be given for every surface which determines 
the intensity of the surface. 

Intensity = R * IL with IL = Intensity of available indirect 

light. 

A more realistic representation results from the definition of one or more 
point light sources in the space. These point light sources, for example 
lamp, candle, or sunshine, have a certain position in the space and shine 
in the direction of the object. In this case, the orientation of the 
illuminated surface to the light source is of great importance. More light 
rays fall on a surface which is perpendicular to the light source than an 
equally large surface which is not perpendicular to the light source. 

The orientation of the surface to the light source can be determined by 
comparing the normal vector of the surface (the vector perpendicular to 
it) with the vector to surface from the light source. If L and N are two 
vectors of length 1, the relation for the angle between L and N is: 

L*N = lx*nx+ly*ny+lz*nz = cos(w) 

For the gray value of the surface the result is then: 

Intensity = R*IL + R* (L*N) *DL 

with the reflection coefficient R and the intensity of the direct light source 
DL, which is between zero and one. 


70 


Abacus Software 


ST 3D Graphics 



Figure 2.8.9: Surfaces with Light Rays 


71 




r 


Machine Language Fundamentals 
for Graphic Programming 







Abacus Software 


ST 3D Graphics 


3. Machine Language Fundamentals for Graphic Programming 


All programs described in this book may be run on various ST 
computer/monitor combinations. To simplify the compatibility, all 
drawing functions for the 3-D graphics project were done with operating 
systems functions (line-A). To introduce you to machine language 
programming on the ST, we first have an explanation of some of the basic 
principles (sine) and then a small program for drawing random lines. This 
program illustrates the program interface to the operating system and a 
simple line-drawing algorithm which writes directly to the screen. The 
line-drawing algorithm is not necessary for the 3-D project coming later 
and is intended only as an example. The use of the algorithm is limited to 
monochrome monitors. Owners of color monitors can replace the call 
drawl with ddrawl (indicated in the listing) if they want to run the 
program mainl. s. 


75 




ST 3D Graphics 


Abacus Software 


3.1 Speed Advantages from tables 


Before starting a project in machine language, you should think about the 
number format to be used. For all the following applications we can 
perform all calculations with 16-bit integers. Another problem is the sine 
function, whose function values can range from -1 and +1. The function 
values can be approximated on computers using the Taylor series, which 
approximates the exact function value through repeated summation of the 
terms of a sequence. In practice, the summation can be terminated after 3 
or 4 terms. As an example, we have here the Taylor series for the sine 
function. 

sin(x) = x - xV3! + x 5 /5! - x 7 /7! + ... 

The angle x is given in radians, and 3! means 3 factorial = 1*2*3 = 6. 
This method is not suitable for quick calculation of sine and cosine values 
because several multiplications must be performed for each function 
value. A rather unelegant but simple and common solution is to store all 
the necessary function values in a table in memory, which can then be 
accessed very quickly. 

The accuracy can be set as desired since the function values are 
calculated before the actual program application and the time factor does 
not play a role. In our example, all sine values between 0 and 360 degrees 
are entered in steps of one degree. This is quite adequate for almost all 
applications which require trigonometric functions. Should an 
intermediate value be required, it can be interpolated from the table. 
Since the cosine function is the same as the sine function shifted by 90 
degrees, the cosine functions can also be taken from the sine table. 

The function values of the angle functions are real numbers which are 
floating point numbers with several places after the decimal point. Since 
all our calculations involve only integers, it is necessary to transform the 
values of the sine function. This is done by multiplying by a sufficiently 
large number-in our example with 214 = 16384. 


76 


Abacus Software 


ST 3D Graphics 



The length of the line c and the angle alpha are already known, and we 
want to find the length of b. According to the definition of the angle 
function, the length of the distance =c* sin (a) = 20*sin(45). The 
sine of 45 degrees is 0.707106781 with nine-place precision. In our table 
we have the value 0.707106781 * 16384 = 11585 for 45 degrees. After 
multiplying by 20 we got the number 231700 as a result. We don’t have 
to worry that this number will exceed the value range of 16-bit integer 
arithmetic because the processor always produces a 32-bit product as the 
result of a 16-bit multiplication. This 32-bit result, the number 231700, 
can now be adapted to the original value range by dividing by 16384, and 
we get 14 as the result. 

You may ask yourself why 16384 was used for the multiplication: first of 
all the number is large enough to extend the range of the sine function. 
Numbers between -1 and 1 become numbers between -16384 and 
+ 16384. Second, the multiplication can be performed with two very fast 
commands of the processor. Multiplications by a multiple of two can be 
replaced in all microprocessors with shift commands which don’t take 
much more time than an addition. 


77 





ST 3D Graphics 


Abacus Software 


At this point I would like to briefly discuss the possibilities of the table 
representation in the computer. The sine table is the simplest form of a 
table, a linear list. The individual table values are stored sequentially in 
memory. Our sine table for the first values looks like this: 

sintab: .dc.w 0,286,572,857,1143,1428,1713,1997,2280 
.dc.w 2563,2845,3126,3406,3686,3964,4240,4516 
.dc.w 4790,5063,5334,5604,5872,6138,6402,6664 

Since the gradations of the angles are in 1 degree steps, the first table 
value gives the sine of 0 degrees, the second the sine of one degree, the 
third the sine of two degrees, etc. The 91st table value is the sine of 90. 
table value and the sine of 360 degrees is represented by the 361st value. 
Zero is chosen as the start to match the table numbers to the 
corresponding angle. This means that table value zero represents the sine 
of zero degrees. Value number 90 corresponds to 90 degrees and 180 to 
180 degrees. The 68000 computer makes access to this table very easy 
through its excellent addressing capabilities. The initial address of the 
table is loaded into the address register. This is the address where the zero 
element is stored. With the number of the desired table value in a data 
register it is possible to access the location using the addressing mode 
"address register indirect with index." In this table format it is absolutely 
necessary to pay attention to the data length of individual entries. The 
address of the zero value is equal to the beginning address of the table 
plus zero, but the address of the first value is the beginning address of the 
table plus two, since each value occupies two bytes. This means that the 
index number in the data register must be multiplied by the number of 
bytes for one entry. In this case it is two bytes. This multiplication by two 
is very fast with one left shift of the bits in the index number. 


78 


Abacus Software 


ST 3D Graphics 


3.2 Assembler routines for screen manipulation 


The screen of the Atari ST is organized using what is called bit-mapped 
graphics. This means that bits which are set in the screen storage 
correspond directly to dots on the monitor and therefore there is no 
difference between text and graphics. Since the screen memory is part of 
the main memory of the CPU, it can be manipulated quickly, i.e. without 
waiting cycles. For monochrome display the resolution is 640*400 points, 
which are represented by 400 times 640 bits in RAM. 


Address: $78000 _ $78001 _ $78002 _ ■■■$7804F X 0>*= X >- 639 ^ 


$78000 

76543210 76543210 


$78050 

Bil number 


$780A0 



$780F0 

$780F1 


$7FCB0 

1 

Y 0 >- Y >- 399 

r 



Figure 3.2.1 


The only routines required for screen manipulation are those for 
displaying a point and for drawing and erasing lines. A line of the video 
picture is formed from 80 bytes and the total picture is made up of 400 
lines. The address of a picture point can be calculated as follows: 

address = screen start + Y*80 + INT(X/8) 


79 




ST 3D Graphics 


Abacus Software 


The bit number of the byte can be obtained with the following formula: 
number = 7 - (X MOD 8) 

The function I NT truncates the positions after the decimal point of a real 
number, while the function MOD returns the remainder of the operand by 
the second. For example, 9 MOD 2 returns 1 as the result Screen start is 
the starting address of the screen memory, which is $78000 on the 520 ST 
and 8F8000 on the 1040 ST 

It may appear to be somewhat unusual to have the coordinate origin in the 
upper left comer, but it is easy to change to the lower left comer and this 
is accomplished by negating the Y values and adding 399. The X 
coordinates remain unchanged of course , since the zero point is already 
in the left comer of the display. The Y coordinate 370 in a normal left 
system becomes (-370+399) = 29 in the screen system. This conversion 
need be made only immediately before points are drawn. Some 
calculations are required to draw a single point. The speed advantage of 
tables for the calculation of the address of a point should also be 
considered here. This table holds the RAM address for every possible Y 
coordinate. This saves a multiplication for every calculation of the screen 
address. Since the plot-point routine is used very often for drawing lines, 
the speed advantage gained by using this table is correspondingly great. 


3.2.1 Drawing lines 


Since the size of a point on the screen is dependent on the resolution of 
the computer, it is not possible to represent a line in the mathematical 
sense. A line which connects two points PI and P3, actually takes a more 
or less jagged path. 


80 


Abacus Software 


ST 3D Graphics 



T 


Xi 



Figure 3.2.2 


Starting from point PI, you have the problem of deciding which points 
must be set, in order to reach point P3. Note that it is possible to set the 
points only at the intersections of the raster lines. The line is formed when 
either the X coordinate is retained and a point drawn with an incremented 
Y coordinate or you can increment the X coordinate while the Y 
coordinate retains its value. 

In mathematics, a line which connects two points is described through its 
slope m. m is a measure of the "steepness" of the line and the larger m 
becomes, the steeper the line becomes. With a positive m, the line rises 
from left to right, while with a negative m it slopes down from left to 
right For a line parallel to the Y axis, the slope is infinite. The expression 
for the slope: 

m = dy / dx 


81 



ST 3D Graphics 


Abacus Software 



Figure 3.2.3 

See Figure 3.2.4 for an explanation of the algorithm for drawing of lines. 


82 





Abacus Software 


ST 3D Graphics 



Figure 3.2.4 


Let us assume that in drawing the line from PI to P3 that we have 
already reached the point P2 already and now have to decide the direction 
in which to draw. In our example, the point P2 is ’’over" the ideal line 
from PI to P3. Expressed mathematically, the slope of the connecting 
line from Point PI to P2 ml=(p2y-ply)/(p2x-plx) = wy/wxis 
greater than the rise of the line which connects the points PI and P3 
m2= (p3y-ply) / (p3x-plx) =dy/dx. As the illustration shows, the 
next step in drawing must be made in the X direction. 

With the comparison of the two slopes, we have found a decision 
criterion for the direction of drawing: If the slope of the connecting line 
between the starting point of the drawing PI and an intermediate point 
P 2 is greater than the slope of the line between the beginning and end 
points (PI, P3), a drawing step should be made in the X direction . If 
the slope is smaller, the next point should be drawn in the Y direction. 
For the purpose of programming this criterion we shall define a decision 
variable D, which is assigned the difference between the desired and the 
actual slope. 


83 




ST 3D Graphics 


Abacus Software 


D = (dy/dx)-(wy/wx) 

If D is larger than zero ==> Step in Y direction 
If D is smaller than zero ==> Step in X direction 
After a small conversion we get: 

D*dx*wx = (wx*dy)-(wy*dx) 

Multiplications slow down calculations, so we should try to eliminate 
them from the calculation. The exact value of D is of no interest. It is only 
important to know how D changes with a step in the X or Y direction so 
that an eventual change in the sign of D can be recognized. For this 
reason it is also possible to replace the expression D*dx*dy with D 
again. 

D = (wx*dy) - (wy*dx) 

During a step in the X direction, wx is increased by one while we retain 
the old value of wx. For our D which we call new D or ND to distinguish it 
from D, the following results: 

ND = (wx+l)*dy - wy*dx 

ND = wx*dy + dy - wy*dx 

The last expression is equal to old D + dy, where old D corresponds to 
the value of D before the step in the X direction. Analogous to this for a 
step in the Y direction: 

ND = wx*dy - (wy+l)*dx 

ND = wx*dy - wy*dx - dx 

As you can see, D is reduced by dx with a step in the Y direction. For ND 
can be written: 

Step in Y direction ND = D - dx 
Step in X direction ND = D + dy 


84 


Abacus Software 


ST 3D Graphics 


The multiplications have been replaced according to our desires by 
additions. To formulate the algorithm, we must still decide in what 
direction we will draw if D is zero. This can be decided at random and in 
our example ND=0 results in a step in the Y direction. Another special 
case which has not been mentioned is when dy is zero. In this case, steps 
can be made only in the X direction since the resulting line must be a 
parallel to the X axis. This case can only be determined with a test at the 
beginning of the routine. 

Furthermore, we have only considered lines with a positive slope, that is, 
those where py3 is smaller than pyl. To retain the decision method in 
this form, it is necessary to make negative dx and dy values positive 
through multiplication with -1, and to decrease the X and Y coordinates 
by one instead of increasing them for every step in the X or Y direction. 
The algorithm for drawing a line between the points PI [xl, yl] and 
P 3[x3,y3] appears like this in a structogram: 


85 




ST 3D Graphics 


Abacus Software 



Figure 3.2.5: Structogram Draw line 


86 
























Abacus Software 


ST 3D Graphics 


3.3 Operating system functions 


Since we will use only operating system functions for the 3-D graphics 
programming, some should be explained before they are used. One of 
these functions is the routine for switching the beginning address for the 
video controller. All computers which which can display animated 
graphics quickly and flicker free have the ability to work with two logical 
screen pages internally. 

Fast drawing and erasing of objects on the screen and the rapid accesses 
to the screen RAM by the computer and the video controller, causes the 
monitor picture to be unstable and to flicker. If the hardware has the 
ability to tell the video controller where in RAM the screen memory 
starts, the strategy for the creation of flicker free graphic is very simple. 

We define two logical screen pages. We will use the Atatri ST as a 
concrete example: in the Atari ST with 512K RAM the standard screen 
page is stored between $78000 to $7FFFF and it is possible to define a 
second screen page from $70000 to $77FFF. In the initial state, both 
screen pages are erased and the video controller shows the page starting 
at $78000. Now the first picture can be drawn in the RAM starting at 
address $70000. After drawing the picture, the video controller is 
informed at a suitable time of the new beginning address for the screen 
RAM ($70000). A suitable time for switching is the time period in which 
the electronic beam which draws the video picture returns, without being 
seen, from the lower right comer of the screen to the upper left corner. 

This moment is even recognized by the operating system and the 
switching of the screen pages can be solved without any major 
programming effort. If the page starting at $70000 is being displayed by 
the video controller, the CPU can draw another picture, such as the object 
in another position, in the page starting at $78000 without disturbing the 
picture construction. After the new picture is completed, pages are 
switched again and you can erase the old picture in the storage area which 
is not being displayed. In general, the page which is being displayed is 
considered to be the physical page in which the drawing is taking place is 
the logical page. Only when both are identical do you see the progress of 
the drawing on the screen. 


87 



ST 3D Graphics 


Abacus Software 


3.3.1 Starting a Program 


To start a machine language program on the Atari ST you have to know 
what happens when a program icon is clicked with the mouse. The 
operating system loads the appropriate program and passes control to the 
program once it is loaded. After loading a program, the operating system 
declares the entire memory as occupied so that it is not possible to move 
data or program sections. To avoid this disadvantage, the called program 
must determine its actual memory requirements, declare this area as 
occupied, and leave the rest of the memory free. The Atari operating 
system simplifies this task by passing a pointer on the stack to the called 
program indicating the memory area occupied by the program and data. 

The called program can calculate the memory actually required and 
declare the unused area as vacant to the operating system. Note: 
sufficient space must be reserved for the processor stack. From the 
Digital Research documentation, it is not clear how much stack space is 
required for the GEM functions, but the 4K bytes reserved for this 
purpose in the example should be sufficient for all purposes. To make it 
possible to use all GEM functions, it is recommended that the program 
call the functions Application-Init and then Open-Virtual- 
Workstation when it starts. After these two calls, GEM-DOS, the 
BIOS, Extended-BIOS and the AES and VDI functions are available to 
the program. An overview of these functions are available in the two 
Abacus Software books Atari ST Internals and the large Atari ST GEM 
Programmer’s Reference. 

All programs in this book were written using the assembler from Digital 
Research. For users of other home computers the assembler is probably 
new, and so I want to discuss it briefly. The assembler is completely disk 
oriented, i.e. all input and output comes from and goes to the diskette. 
First you create the source text of the program with an editor, store it on a 
diskette and call the assembler with name of the source text The 
assembler processes the source text by creating several auxiliary files on 
the diskette. Finally it writes the desired object file on the diskette. 

The object file which was created, recognizable by the extension . o, is 
not executable since it was assembled at the absolute address zero. To 
generate an executable program the absolute addresses must be replaced 
with relative addresses to make it possible to load the program into any 
memory area. For this purpose, you call the program RELMOD.PRG 


88 


Abacus Software 


ST 3D Graphics 


which then creates the desired run-time program file. In this you can 
write manner machine language programs whose length is limited only by 
the storage capacity of the computer and the floppy disk. It is impossible 
to combine two programs which are already object files with this method, 
however. 

For this reason, one usually adds an intermediate step, as is also done 
with higher level languages, called linking. The linker permits several 
separately-assembled object files to be combined into one single file. 

Large assembly language programs quickly become difficult to 
understand and it is recommended that they be divided into at least two 
modules. The first module initializes the program and contains all of the 
error-free and tested subroutines, while the second module contains the 
latest main program. This can reduce the assembly time considerably 
since the large basic module must be assembled only once and afterwards 
only linked to the main program. The use of the linker also permits the 
use of assembler directives which would otherwise not be possible. The 
assembler in conjunction with the linker can manage three separate 
program areas: text, data, bss. The text area contains the actual program, 
i.e. the program text, and the data area contains the initialized data. These 
are variables to which values were assigned already before the start of the 
program. In the bss area there is storage space reserved for the data which 
has not been initialized. 

Each of the programs; assembler, linker and relocator require parameters, 
which are passed during the start. To assemble the basic module, first 
select AS68.PRG and then INSTALL APPLICATION from the 
OPTIONS menu as TOS-takes parameters. Then enter the following line 
into the dialog box which appears: 

-p -I -u basicl.s > basicl.lst 

where basic 1. s is the name of the text file to be assembled. The -p 
and > basicl.lst statements create a listing to the disk of the 
assembly process which can later be printed for examination. The 
assembler creates a file with the name basicl.o. This object file 
contains the tested subroutines and will be linked to the current main 
program. 


89 



ST 3D Graphics 


Abacus Software 


To assemble and link the main program, it is best to create a batch file, 
which contains the individual command sequences. The batch file could 
look like this: 


as68 -1 -u %2. s 
wait.prg 

link68 [u] %2.68k=%l.o,%2.o 
relmod %2.68k %2.prg 
rm %2.68k 
rm % 2.o 
wait.prg 

This batch file might be stored under the name aslink.bat on the 
diskette. The batch file is made very flexible through the use of two place 
holders, %1 and %2. To assemble the main program with the name 
mainl. s and the subsequent linking with the basic module basicl. o 
You call the program batch.ttp and pass the command sequence in 
the dialog box: 

aslink basicl mainl 

After the assembly process the desired program file mainl.prg is 
finally on the diskette. This creation of modules makes working with the 
disk drive more bearable and the coffee breaks during assembly shorter. 

As a practical test of all this, we have here the first version of the 
basicl . s program and the first demo program. The basic program 
contains only the initialization of the program and the basic routines for 
screen manipulation such as screen erasing, and drawing of points and 
lines. Assembly is done with: 

as68 -1 -u basicl.s 

The first main program demonstrates the speed of the computer by 
drawing random lines and demonstrates how to call the operating system. 
The steps for the creation of the ready-to-run program file mainl .prg, 
without using a batch file are as follows: 

1. Assemble MAIN1.S with the AS68.PRG. 


90 


Abacus Software 


ST 3D Graphics 


2. Link the two object files with the 
Linker. 

Iink68 [u] mainl.68k = basicl.o,mainl.o 

3. Create a relocatable program with 
relmod mainl.68k mainl.prg 

The file mainl. prg can be started by clicking with the mouse after the 
file Relmod, the two files mainl. o and mainl. 68k, which are no 
longer needed, are erased with the program RM. 

The listing should be self-explanatory with all of its comments. It should 
offer an easy introduction to graphics programming in machine language. 
More detailed explanations of the routines used can be found with the 
explanation of the link files grlinkl.s in section 4.1. Starting with 
Chapter 4 we will really start to program. 



91 





























ST 3D Graphics 


Abacus Software 


*********************************************************************** 

* Link file basicl.s, is linked with the main program whose entry * 

* routine must have the name main. * 

* U.B. 11.85 * 

*********************************************************************** 


.globl wait,wait1,drawl,ddrawl,inlinea 
.globl grafhand 
•globl grhandle 

.globl global,contrl,intin,intout,ptsin,ptsout,addrin,addrout 
.globl apinit,openwork,clwork,aes,vdi 
.globl inkey 

.globl mouse_on,mouse_off,printf 
.text 


******************* 




* Entry to the program, initialization of all operating system * 

* functions and creation of the Y-tables (For computers with color * 

* monitors, replace "jsr startl" with "jsr start2". * 

* Furthermore when using a color monitor/ replace all * 

* "jsr drawl" calls in the main program with "jsr ddrawl". 


********************** 




art: 


★ 

initialize the program 

movei1 

a7, a5 

★ 

Base page address is on the stack 

move.1 

A (a5),a5 

* 

base page address = program start - $100 

move.1 

$c(a5),dO 

* 

Program length 

add. 1 

$14(a5),dO 

★ 

Length of initialized data area 

add. 1 

$lc(a5),dO 

★ 

Length of data area not initialized 

add. 1 

#$1100,dO 

* 

4 K-Byte user stack=sufficient space 

move.1 

a5,dl 

★ 

Starting address of the program 

add. 1 

dO, dl 

* 

Plus number of reserved bytes = space required 

and. 1 

#-2,dl 

* 

even address for stack 

move.1 

dl, a7 

* 

User stackpointer to last 4K- byte 

move.1 

dO, -(sp) 

* 

Length of reserved area 

move.1 

a5, -(sp) 

* 

Beginning address of reserved area 

move.w 

dO,-(sp) 

★ 

Dummy-Word 

move.w 

#$4a,-(sp) 

★ 

GEM DOS function SETBLOCK 


92 


Abacus Software 


ST 3D Graphics 


trap 

#1 



add. 1 

#12,sp 

★ 

old stack address restored again 

jsr 

start1 

* 

Create Y-table 

jsr 

main 

* 

Jump to main program. ( User-created 

move.1 

#0,- (a7) 

* 

Terminate program running 

trap 

#1 

★ 

Back to Gem-Desktop 


******************************************************************** 

* Call a AES-Routine, where the parameters are passed to * 

* to the various arrays (contrl,etc.) * 

******************************************************************** 


aes: move.1 #aespb,dl * call the AES routines 

move.w #$c8,d0 

trap #2 

rts 

************************************************************************ 

* Call a VDI-Routine * 

ft******************************************************************** 

vdi: move.l #vdipb,dl * call the VDI routines 

move.w #$73,dO 

trap #2 

rts 

********************************************************************** 

* Announce the program * 

********************************************************************** 


clr. 1 

dO 

move.1 

dO,aplresv 

move.1 

dO,ap2resv 

move.1 

dO,ap3resv 

move.1 

dO,ap4resv 

move.w 

#10,opcode 

move.w 

#0,sintin 

move.w 

#1,sintout 

move. w 

#0,saddrout 

move.w 

#0,saddrin 

jsr 

aes 

rts 



* Announce the program as 

* Application 


93 



ST 3D Graphics 


Abacus Software 


*********************************************************************** 

* Check on screen handler and store for other functions * 

*********************************************************************** 


grafhand: move.w 

#77,contrl 

* Get the screen handler 

move.w 

#0, contrl+2 

* and store it in the global 

move.w 

#5,contrl+4 

* Variable grhandle 

move.w 

#0,contrl+6 


move.w 

#0,contrl+8 


jsr 

aes 


move.w 

intout,grhandle 


rts 




*********************************************************************** 

* Open a Virtual Screen Work Station where all GEM drawing functions * 

* will occur. * 

*********************************************************************** 


openwork: move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move. w 
move.w 
move. w 
move.w 
move.w 
move.w 
move.w 
jsr 
rts 


#100,opcode 
#1, d0 

#0,contrl+2 

#11,contrl+6 

grhandle,contrl+12 

dO,intin 

dO,intin+2 

dO,intin+4 

dO,intin+6 

dO,intin+8 

dO,intin+10 

dO,intin+12 

dO,intin+14 

dO,intin+16 

dO,intin+18 

#2,intin+20 

vdi 


* open a workstation 


* screen handler 


94 



Abacus Software 


ST 3D Graphics 


*'*******★★*******★***★**★★★**’***★***★*★★**★**★***★**★★**★★★★★*******★★* 

* Clear the workstation * 

*********************************************************************** 


clwork: 


move.w 

#3,contrl 

* Clear 

workstation 

move.w 

#0,contrl+2 

* clear 

the screen 

move.w 

#1,contrl+6 



move.w 

grhandle,contrl+12 



jsr 

vdi 



rt s 





* Turn on the mouse and its control. * 


move. w 

#122,contrl 

* turn on the mouse 

move.w 

#0,contrl+2 

* its control 

move.w 

#1,contrl+6 


move.w 

grhandle,contrl+12 


move.w 

#0,intin 


jsr 

rts 

vdi 



*********************************************************************** 

* Turn off the mouse and control. * 

*********************************************************************** 


mouse off: 


move.w 

#123,contrl 

* turn off the mouse 

move.w 

#0,contrl+2 

* its control 

move.w 

#0,contrl+6 


move.w 

grhandle,contrl+12 


jsr 

vdi 


rts 




95 


ST 3D Graphics 


Abacus Software 


********************************* 

* Write a string on the screen 
********************************* 


printf: 

move. 1 

aO,- (a7) 


move. w 

#9,-(a7) 


trap 

#1 


addq. 1 

rts 

#6,a7 

wait 1 

dbra 

rts 

dO,waitl 

wait: 

move.w 

#1, -(a7) 


trap 

#1 


addq.1 

rts 

#2,a7 


************************************* 

* 

************************************* 

* write the string, whose 

* beginning address is in 

* register AO, on the screen. 

* String must terminate with 

* zero. 

* Time loop, counts the dO-Register 

* down to -1 

* wait for a key stroke 

* GEM-DOS-Call 


* Sense keyboard status (does not wait for keypress) and return key * 

* code and also the scan code. 


inkey: 

move.w 

#2,-(a7) 

★ 

Sense keyboard, does not wait for key 


move.w 

#1,-(a7) 

* 

activation and return an ASCII-code 


trap 

#13 

★ 

of an activated key in the lower half 


addq.1 

#4,a7 

★ 

of the long word of DO, and the scan code 


tst. w 

dO 

* 

in the upper half of the long word of 


bpl 

endkey 

★ 

DO. 


move.w 

#7,-(a7) 




trap 

#1 




addq.1 

#2,a7 



endkey: 

rts 





96 


Abacus Software 


ST 3D Graphics 


e******************************************************************** 

* Draw-line-routine, draws directly into the screen storage and is * 

* used only for the high resolution mode {640*400 Points ). For color * 


* monitor use ddrawl 
************************************ 


drawl: 

move. 1 

d7,-(a7) 

* 


move.1 

#ytab,aO 

* 


clr. 1 

d4 



move. w 

#1, a4 

* 


move. w 

a4, a5 

* 


move. w 

a2,d6 



sub. w 

d2,d6 

* 


bge 

dxispos 



neg. w 

d6 

* 


move. w 

#-l,a4 

* 

dxispos: 

move .w 

a3,d7 



sub.w 

d3,d7 

* 


bgt 

plotit 

* 


beq 

dyis 0 

* 


neg. w 

d7 

* 


move .w 

#-l,a5 

* 


bra 

plotit 


dyis_0: 

not. w 

d4 

* 

plotit: 

tst .W 

d2 

* 


bmi 

draw_it 

* 


tst. w 

d3 



bmi 

draw_it 



cmp. w 

#639,d2 



bhi 

draw_it 



cmp. w 

#399,d3 



bhi 

draw_it 



move.w 

d3,d0 

* 


lsl. w 

#2, dO 

* 


move.1 

0(aO,dO.w),al 

* 


move.w 

d2,dl 

* 


lsr .w 

#3, dl 

* 


move.w 

d2,d0 

* 


not. w 

dO 

* 


* 

********************************** 

Save register 
Address of the Y-table 

X step = +1 
Y step = +1 

DX in d6 = X2 - XI 


If DX is negative, then 
make positive through negation 

DY in d7 

If DY is larger than zero draw then 
first point 

DY is negative, make positive 
Y-Step is then -1 

If DY = 0 then parallel to X-Axis 

Test if drawing area was 
exceeded 


Y-value times two for access to 

Plot table 

Screen address 

X-value 

INT (X/8) 

X-value 

-X 


97 


ST 3D Graphics 


Abacus Software 


********************************** 

* Here the point is drawn * 

********************************** 



bset 

dO, 0(al,dl.w) 

* 

7-(X MOD 8) with the bset-command 

draw it: 

cmp. w 

d2,a2 

* 

End X reached? 


bne 

notend 

* 

no 


cmp. w 

d3, a3 

* 

End Y reached? 


beq 

endit 

* 

no 

notend: 

tst .w 

d4 

★ 

D > 0 => Y step 


bge 

ystep 



xstep: 

add. w 

a4,d2 

★ 

else X step X=X+-1 


add. w 

d7,d4 

★ 

ND = D + DY 


bra 

plotit 



ystep: 

add. w 

a5, d3 

* 

Y=Y +- 1 


sub. w 

d6, d4 

* 

ND = D - DX 


bra 

plotit 



drawend: 





endit: 

movem. 

1 (a7)+,d7 

* 

restore register 


rts 


★ 

Return to calling program 


********************************************************************** 

* This Draw-line-routine is universal for all monitor types and * 

* can be used with all resolutions. * 

********************************************************************** 


move.1 

d7,-(a7) 



move.1 

tlineavar,aO 



move.w 

d2, 38 (aO) 

* 

XI 

move.w 

d3,40(aO) 

* 

Yl 

move.w 

a2,42 (aO) 

* 

X2 

move.w 

a3,44(aO) 

* 

Y2 

-dc. w 

$a003 

* 

draw line 

move.1 

(a7)+,d7 



rts 





98 



Abacus Software 


ST 3D Graphics 


********************************************************************** 

* Initialize the Line-A variables and store the address of the * 

* Variable block in lineavar. * 

********************************************************************** 


inlinea: 


.dc. w 

$a000 

★ 

initialize the Line 

move.1 

aO,lineavar 



move.w 

#0,32 (aO) 



move.w 

#$ffff,34 (aO) 

* 

Sample of the line 

move.w 

#0,36(aO) 

* 

Writing mode 

move.w 

#1,24(aO) 

* 

drawing color 

rts 





* Creation of the Y table for the highest graphic mode (640*400) * 


startl: 

move. w 

#2,-(a7) 

* 

checks the screen address of the 


trap 

#14 

* 

System, recognizes which computer 


addq. 1 

move.1 

#2,a7 

d0,physbase 

* 

Display start minus 32 K-Byte 


move. 1 

#399,dl 

* 

Number of lines minus one 


move. 1 

#ytab, aO 

* 

Physical address 

stloopl: 

move.1 

dO,(aO)+ 

* 

New address equals old address 


add. 1 

#80,dO 

* 

plus 80 


dbra 

rts 

dl,stloopl 




* Line-A initialization * 

start2: jsr inlinea * Initialize line A 

rts 


99 




ST 3D Graphics 


Abacus Software 


******************************************************************** 

* Variables of the basic program * 

******************************************************************** 


lineavar: 

.even 

.bss 

.ds. 1 

1 * Storage for address of Line-A variable 

physbase: 

.ds. 1 

1 * Storage for screen address. 

ytab: 

.ds. 1 

400 * Storage for the Y table 

contrl: 


* Arrays for AES and VDI functions 

opcode: 

.ds .w 

1 

sintin: 

.ds.w 

1 

sintout: 

.ds. w 

1 

saddrin: 

.ds.w 

1 

saddrout: 

.ds.w 

1 


.ds.w 

6 

global: 

apversion: 

.ds.w 

1 

apcount: 

.ds.w 

1 

apid: 

-ds.w 

1 

apprivate: 

.ds. 1 

1 

apptree: 

.ds. 1 

1 

aplresv: 

.ds.l 

1 

ap2resv: 

.ds. 1 

1 

ap3resv: 

.ds.l 

1 

ap4resv: 

.ds.l 

1 

intin: 

.ds.w 

128 

ptsin: 

.ds.w 

256 

intout: 

• ds.w 

128 

ptsout: 

.ds.w 

128 

addrin: 

.ds.w 

128 

addrout: 

.ds.w 

128 

grhandle: 

.ds.w 

1 

vdipb: 

.data 

.dc. 1 

contrl,intin,ptsin,intout,ptsout 

aespb: 

.dc. 1 

contrl,global,intin,intout,addrin,addrout 


.end 



100 


0 



Abacus Software 


ST 3D Graphics 


*********************************************************************** 

* Main program for link file basicl.o , runs only in connection with * 

* this link file . U.B. 11.85 

* Draws random line in coordinate area 0-255. The value area 

* is valid for both axis 

*********************************************************************** 
.globl main 
.text 


* Entry point from the linkfile 


* 


main: 

jsr 

apinit 


jsr 

grafhand 


jsr 

openwork 


jsr 

mouse_off 


jsr 

clwork 

W 

jsr 

inlinea 

loopl: 

jsr 

clwork 


move. 1 

ttextl,aO 


jsr 

printf 


move.1 

loopc,d7 

loop2: 

jsr 

random 


and. w 

border,dO 


move.w 

dO, xO 


jsr 

random 


and. w 

border,dO 


move. w 

dO, yO 


jsr 

random 


and. w 

border,dO 


move.w 

dO, xl 


jsr 

random 


and.w 

border,dO 


move.w 

d0,yl 


move.w 

x0,d2 


move.w 

xl,a2 


move.w 

y0,d3 


* Announce application 

* 

* Open screen work station 

* Hide the Mouse 

* Clear Display 

* Color version only 

* Address of text after AO 

* Write text 


* Generate random number 

* bring to area 0-255 

* through masking out of the upper 

* 8 Bits of the lower word in DO 


* transfer the two points to the 

* "right" registers 




101 







ST 3D Graphics 


Abacus Software 


move.w 

yl,a3 



jsr 

drawl 

* 

Draw line from XO,YO to XI,Y1 sketch 

dbra 

d7,loop2 

* 

Repeat loopc 

jsr 

inkey 

* 

Sense keyboard, do not wait for key 

swap 

dO 

* 

activation, scancode in DO 

cmp. w 

#$44,dO 

* 

compare with code in F10 

bne 

loopl 

* 

If not : loop again 

rts 


* 

otherwise terminate program 


*********************************************************************** 

* Call the operating system function for creation of a 4-byte integer* 

* random number, the number is returned to DO. * 

*********************************************************************** 

random: move.w #17,-(a7) * generate a 4-Byte Integer- 

trap #14 * Random Number in DO. Use only 

addq.l #2,a7 * the lower 2-Bytes 

rts 

.data 

.even 

********************************************************************** 

* Variables for the Main program * 

* * 
********************************************************************** 

********************************************************************** 

* Text for the printf function, 27 Y 34 96 positions the cursor * 

* Sequence is column, line, both with an offset of 32 * 

********************************************************************** 


text 1: 

. dc -b 

27, ' Y' 

,40,42, 

' Random lines ',0 

loopc: 

. dc. 1 

60 

* 

Number of lines 

border: 

. dc. w 

$ff 

* 

255 as display limit, with the high' 

★ 



* 

resolution B-W monitor the $ff 

* 



* 

can be replaced with $lff = 511 


102 








Abacus Software 


ST 3D Graphics 


********************************************************************** 



.bss 




.even 



x0: 

.ds .w 

1 

* Temporary storage for the two 

Y 0: 

.ds.w 

1 

* Points, the program runs with small 

xl: 

• ds .w 

1 

* changes even without the intermediate 

yl: 

.ds.w 

1 

* storage; what changes ? 


.end 




103 










Abacus Software 


ST 3D Graphics 


4. Graphics using assembly-language routines 


The programs presented in the following part of the book can be used 
with monochrome as well as color monitors, since the line drawing is 
performed by the operating system, or to be more accurate, by the LINE- 
A-routines. Of course it would be possible to convert the draw-line- 
algorithm from the first link file for the various picture formats, but this 
process has the disadvantage of requiring a subroutine for every picture 
format. The programs described here can be executed on all kinds of 
computer-monitor combinations. During program start, the main program 
recognizes what type of monitor is attached and what resolution is desired 
and on the basis of this information provides some variables with the 
required data. For example, the coordinate origin of the picture system is 
placed in the middle of the display. The larger memory capacity of the ST 
permits it to handle significantly larger quantities of data. Once the 
operating system of the smaller models is placed in ROM, the area 
released in RAM will be sufficient even for the largest applications. 
When calling the Metacombco Editor for input of the larger source files 
(grlinkl, menul, rotatel, paintl) you have to specify 
more memory space for listing to be entered along with the filename. To 
do this, enter grlinkl. s 23000 in the dialog box that appears. This 
reserves about 80k for the source text. If you enter source text without 
comments the space reserved in the basic version of the editor should be 
sufficient. 


107 


ST 3D Graphics 


Abacus Software 


4.1 Definition of a data structure for an object in space 


The program modules presented here have the ability to represent on the 
screen any object in a user defined world in any position, as seen from 
various positions. The single disadvantage is the limitation of the valid 
value range to ±32000; this means that for the definition of the world a 
right angle three dimensional Cartesian coordinate system (right system) 
is available whose three coordinate axes (X-Y-Z) are labeled with values 
between +32000 and -32000. Whether these values are in meters, 
kilometers or the number of corrupt politicians in the Senate depends on 
the individual user and the application. For example, using the number of 
corrupt politicians is a questionable value, since it changes from moment 
to moment, and is far from constant. 

Joking aside, a very simple object should suffice to describe the data 
structure. We will use simple house as in Figure 4.1.1. 



Figure 4.1.1: House as Wire Model 


108 



Abacus Software 


ST 3D Graphics 


Every object in the coordinate system is described through a finite 
number of points and the lines which connect these points. To represent 
the object, these points in the world system must be specified by 
declaring of their coordinates. It has proved to be useful to define the 
object, in this case the house, in its own coordinate system and to 
transform it during the construction of the world coordinate system. To 
gain an advantage, the coordinate origin of the object system is located 
inside the house, if possible at a "rotationally neutral” point, i.e. during a 
rotation of the object around this point, the maximum changes of the 
individual points resulting from the rotation should be minimized. The 
object should not be distorted. 



Figure 4.1.2: House with coordinate system included 


The individual steps during the "construction” of the house therefore are: 

1. Draw a total view of the object (on a piece of paper) and 
arbitrarily number of the individual points. 


109 





ST 3D Graphics 


Abacus Software 



Figure 4.1.3: House with numbered points 


2. Draw the object in the various possible aspects with the current 
coordinate axis for accurate specification of the points. 


110 


Abacus Software 


ST 3D Graphics 


Figure 4.1.4 - Figure 4.1.9: six views of the house 




ill 


ST 3D Graphics 


Abacus Software 



Figure 4.1.6 



Figure 4.1.7 


112 





Abacus Software ST 3D Graphics 



Figure 4.1.9 

3. Set up a coordinate list of the individual points. 

4. Create a line list, i.e. state which points are connected by 
lines. 

5. Indicate the number of points and lines in the object. 


113 





ST 3D Graphics 


Abacus Software 


Coordinate list of the house: 


Point No. 

X-coord. 

Y-coord. 

Z-coord. 

1. 

-30 

30 

60 

2. 

30 

30 

60 

3. 

30 

-30 

60 

4. 

-30 

-30 

60 

5. 

30 

30 

-60 

6. 

-30 

30 

-60 

7. 

-30 

-30 

-60 

8. 

30 

-30 

-60 

9. 

0 

70 

60 

10. 

0 

70 

-60 

11. 

-10 

-30 

60 

12. 

-10 

0 

60 

13. 

10 

0 

60 

14. 

10 

-30 

60 

15. 

30 

20 

40 

16. 

30 

20 

10 

17. 

30 

0 

10 

18. 

30 

0 

40 

19. 

30 

20 

-10 

20. 

30 

20 

-40 

21. 

30 

0 

-40 

22. 

30 

0 

-10 

23. 

30 

-10 

0 

24. 

30 

-10 

-20 

25. 

30 

-30 

-20 

26. 

30 

-30 

0 


Total of 26 points. 


114 




Abacus Software 


ST 3D Graphics 


Line list: 


Line No. from point to point 


1. 

1 

2 

2. 

2 

3 

3. 

3 

4 

4. 

4 

1 

5. 

2 

5 

6. 

5 

8 

7. 

8 

3 

8. 

8 

7 

9. 

7 

6 

10. 

6 

5 

11. 

6 

1 

12. 

7 

4 

13. 

9 

10 

14. 

1 

9 

15. 

9 

2 

16. 

5 

10 

17. 

6 

10 

18. 

11 

12 

19. 

12 

13 

20. 

13 

14 

21. 

15 

16 

22. 

16 

17 

23. 

17 

18 

24. 

18 

15 

25. 

19 

20 

26. 

20 

21 

27. 

21 

22 

28. 

22 

19 

29. 

23 

24 

30. 

24 

25 

31. 

25 

26 

32. 

26 

23 


Total of 32 lines. 


115 


ST 3D Graphics 


Abacus Software 


Additional information on the object is required for the transformation of 
the house into the world coorinate system: the angles housxw, housyw, 
houszw, which describe a rotation of the house about one of the three 
axes in regard to the coordinate origin, and the location of the house in 
the world coordinate system. The location is the point to which the 
coordinate origin (rotationally neutral point) of the house system is 
displaced in the world system, housxO, housyO, houszO. In our first 
example program the coordinate origin of the house system is moved to 
the coordinate origin of the world system, housxO etc. and therefore 
zero. 

For further information, we need an observation point and a projection 
center, where both points naturally are described in world coordinates. In 
the simplest case the observation point is the coordinate origin point of 
the world system, and the projection center [prox, proy, proz ] is 
located on the positive Z axis of the world system. The system of the 
observer (view system) is a right system in our programs and it is not 
necessary to transform to a left system, to multiply all Z values by -1. For 
our case this means that after transformation the view system a point with 
the coordinates [ 10 , 10 ,- 300 ] is farther from the observer than a 
point with the coordinates [10,10,-200]. 

Furthermore, we need the normal vector (direction vector) of the 
projection plane. For simplification we assume that it is pointed from the 
projection center toward the coordinate origin of the world system and 
points toward the negative Z axis. The projection center lies on the Z axis 
and therefore has the coordinates [0,0, proz ], since the normal vector 
of the projection plane points in the direction of the negative Z axis, the 
rotation of the observation direction vector to the negative Z axis is not 
necessary. 

To help explain the coordinate systems and viewing points, we have here 
Figure 4.1.10 with the world system and the observation factors defined 
in it. 


116 




Abacus Software 


ST 3D Graphics 



Figure 4.1.10 


Summary: 

To represent the house on the screen we need a total of four coordinate 
systems, where the various coordinate systems exist only in theory and all 
transformations occur in a single system. The defined points are stored in 
arrays in which the various coordinate systems are then reflected so they 
do not disappear after a transformation. The following coordinate systems 
are used: 

1. The data system (housdatx, housdaty, 
housdatz), in which the house is defined at 
construction. 

2. The world system (wrldx, wrldy, wrldz), in which, 
for example, a village is represented by several houses, 
where the houses are all created by transformation at 
various places in the world system from the one single 
house defined in the data system. 


117 





ST 3D Graphics 


Abacus Software 


3. The view system (viewx, viewy, viewz), which is 
used for the description of the view transformation. The 
view transformation is the transformation into the observer 
system, which is described through the observation 
reference point and projection center as well as the vectors 
from projection center to the observation reference. The 
vector from the projection center to the observation 
reference point is therefore the normal vector of the 
projection plane. 

4. The screen system has only two dimensions. The only 
transformation which occurs in this system is shifting the 
coordinate origin to any desired location with reversal of 
the Y axis. Something we also used in our example is the 
displacement to the screen center but other locations are 
also possible depending on the application. 

After this simplified observation situation, now an example for the 
general view-transformation of a more complicated model. As a fictional 
example we will use a world system which represents an airplane 
standing on a runway. The observation point of the system should be in 
the middle of the cockpit window, which is therefore the projection plane, 
and the eye of the pilot should be the projection center. Let us also 
imagine a tanker truck and an airplane hangar at some distance from the 
airplane. Two types of transformations are possible. 

1. A transformation of the object, which might mean that the 
tanker truck moves and approaches the airplane, for 
example. In this case the movement must occur in the 
world system and only the coordinates of the tanker truck 
need be recalculated in the world system. 


118 



Abacus Software 


ST 3D Graphics 


2. A movement of the observer, in this example the aiiplane. 

Let’s go back to the starting position and assume that the 
tanker truck remains in its original position. Now the 
airplane should move, and for simulation of this 
movement all objects in the world system, the tanker truck 
and the hangar, must be transformed. The entire world 
system would be rotated about the center of the cockpit 
window. For a left rotation of the airplane, everything 
must be rotated to the right. This connection can be easily 
verified: If you move your head to the left, the observed 
objects move to the right out of our field of view. When 
the airplane is moved without rotation the observer gets 
the impression of movement through the displacement of 
the coordinate origin of the world system before the 
projection. 

3. A movement of the observer and the object, which means 
first a transformation of the truck in the world system and 
subsequent transformation of the total world system into 
the view system. 

Only after completion of these various cases do we get to the perspective 
transformation, i.e the projection from space to the projection plane, or 
more precisely into the screen. This was an example of a more complex 
observation model. 

You will probably ask why things have to be complicated by using an 
additional coordinate system, the view system, when we could do 
everything in the world system. This is true, but the addition of the view 
system improves the accuracy and provides for a better overview of the 
total system. Because of the rounding errors from the many 
transformations, our world of the tanker truck and the hangar, would 
according to the law of increasing entropy, degenerate to a chaotic mess 
after a few hundred transformations. The aspect of the better overview is 
at least as significant as the accuracy and I want to try to demonstrate this 
fact again. 

As you will see, all transformations can be carried out with a single 
routine. Our application combines almost all of the rotations with matrix 
multiplication and performs displacements before and after these 
multiplications. The displacements are not included in the matrix 
multiplications and our point coordinates are therefore not extended 


119 


ST 3D Graphics 


Abacus Software 


coordinates but consist only of the three coordinates [x,y,z] of the 
current point. The only routine used is the rotation around any selected 
point. As a reminder, during the rotation around any point, the coordinate 
origin must first be moved to this point, then rotated by the desired angle 
and finally the coordinate origin moved inverse to its original place by 
back transformation. For the sequence of our routine this means that the 
point about which rotation should occur is passed, also the rotation angles 
around the corresponding axes (xw,yw,zw). The rotation routine first 
calculates a multiplication matrix through multiplication of the rotation 
matrixes belonging to the various angles. Then all points belonging to the 
desired object [ x, y, z ] are manipulated in the following sequence: 

1. The point [ x, y, z ] is moved to the rotation point. This is 
achieved through subtraction of the coordinates of the 
rotation point from the object coordinates. The result of 
this operation is the point [ x', y', z' ]. 

2. The point [x', y' , z' ] is multiplied by the previously 
calculated total rotation matrix. 

Result: [x'' , y' ', z'' ]. 

3. The point is transformed back to the 

"old" coordinate system by adding of the coordinates of 
the rotation point 

In this model the axes are not scaled. The size manipulation of the 
objects, i.e. their pictured size on the screen, is performed during the 
projection through movement of the projection plane. If different values 
are selected for the subtraction occurring at the beginning and the 
concluding addition, the movement of an observer in the world system is 
simulated. If the angles of the normal surface vector in relation to the 
world system are provided (in section 2.5 we calculated the angles 
through projection on the various surfaces) the position of the observer 
can be determined in space through one point and three angles. 

Let us assume that a person is moving our world system, where the house 
discussed in the first example is located at the coordinate origin. The eye 
of this person, or actually the retina of the eye, is the projection plane. It 
is irrelevant that the projection center in the human eye is in front of the 
projection plane, since the reversed picture resulting from this is turned 
around by the brain. For the simulation of this moving observer the 


120 








Abacus Software 


ST 3D Graphics 


coordinate origin of the world system must be moved to the center of the 
retina, but we are limiting ourselves to a single eye. The coordinates of 
the eye in the world system must be known; furthermore the head of the 
observer can be moved through three different axis. You can easily 
determine the axis yourself. The rotation about the first axis in our 
coordinate system corresponds to the X axis, described by the observer 
nodding his head up and down. The Y axis rotation is shaking his head. 
The head rotates on the Z axis when the observer attempts to touch his ear 
to his shoulder. If the three rotaion angles are known, the coordinate 
origin will be rotated about this angle and the observed object lies in the 
coordinate system of the observer. It is not necessary to reverse the 
movement of the coordinate origin which is similar to the example of the 
airplane. 

In principle, an unlimited number of displacements, rotations, and 
observer situations are possible: rotation of the house, rotation of the total 
system around one point, or any axis, and also the displacement with 
rotation into the observer system. To bring some order into this flood of 
rotations, our programming examples are limited to one fixed observer 
location point. This is no limitation on the observed effects on the screen 
however, i.e. in principle it is the same whether one assumes that an 
object rotated around a point, or the observer moved his head, provided 
the size relationships are suitably adjusted. Finally, the programmer must 
know the desired effect. There are many ways to achieve the same 
effects. 

And now, the description of the transformations of our data structure for 
the first, fairly simple transformation program. The concrete object 
(house) is defined in a coordinate system (housdatx, housdaty, 
housdatz). During the initialization of the program, the subroutine 
makewrld moves the house to any desired location in the world system 
(wrldx, wrldy, wrldz), with possible rotation. In the first program it 
is moved to the point [0,0,0] without rotation. 

All further operations concerning the house relate only to the world 
system. For example, the house can be rotated around any point of this 
world system, or only the position of the house can be changed by 
displacement. But now the initial scenario of our model changes through 
these transformations, so we store the data for the rotation of the world 
system in a new coordinate system (viewx, viewy, viewz), where 
the initial scene (in wrldx, wrldy, wrldz) is available at any time 
and can be reproduced at any time. 


121 


ST 3D Graphics 


Abacus Software 


After each operation in this world system, the coordinates of the 
displaced house are stored in the view system. The object should also be 
displayed on the screen. To do this, it must be adapted to the perspective 
of the viewer situation. In our example, the projection center is at the 
coordinates [0, 0, 1500]“therefore on the positive z axis of the right 
handed coordinate system. Through the perspective transformation, the 
coordinates of the view storage are transformed into screen coordinates 
(screenx, screeny) whereby the desired location of the coordinate 
origin and the orientation of the Y axis are considered during the 
calculations. The screen coordinates are transferred with the aid of the 
line list of the drawing routine, which, through the built-in "Cohen- 
Sutherland clipper” draws only the desired screen area using the border 
points clipule and cliplri (clip upper left, clip lower right). To 
create some movement in this house, the rotation origin point or its 
rotation angle can be changed slightly after each drawing and the whole 
process can be programmed into a large loop for repeated execution. 

In case you did not understand a few details, you can relax while typing 
in the following program listings. You should consider that the material 
discussed here corresponds to about a half a semester of lectures for 
upper-class computer science students and therefore requires intense 
consideration, even with the aid of the additional literature cited in the 
beginning. 

Just as in the first small program (random lines) this program is also 
divided into a link file and main program. The new link file has the name 
grlinkl. s and was enhanced with the sine and cosine routines, the 
clip algorithm, the screen switch routine, the matrix operations and the 
perspective transform routine. The main program housel.s contains 
the data of the house and the main loop in which the rotation angles of the 
house are changed in cycle and can be altered by the user. The steps for 
creating a ready-to-run program are the same as in the third chapter. You 
need only to replace basicl. s with grlinkl. s and mainl. s with 
house 1. s in the command sequences. You should start typing in the 
first program since the following programs build on the first two files. 
That way you only have to type in the additional subroutines and data 
sections. The link file grlinkl . s is the same for all following main 
programs and does not have to be changed. 


122 





Abacus Software 


ST 3D Graphics 


*********************************************************************** 

* grlinkl.s Graphic Driver Version 4.0 * 

* The main program must begin with the label " main * 

*********************************************************************** 


*********************************************************************** 
* Global variables in the link files * 


.globl drawl,sin,sincos,physbase 
.globl logbase 

.globl sinx,siny,sinz,cosx,cosy,cosz,wait 

.globl waitl,drawnl 
.globl pers,grafhand 

•globl nummark,xangle,yangle,zangle,numline,datx,daty,datz 
.globl pointx,pointy 

.globl pointz,xplot,yplot,xO,yO,zO,zl,linxy,sincos 
.globl grhandle,global,contrl,intin,intout,ptsin,ptsout 
.globl addrin,addrout 

.globl apinit,openwork,clwork,aes,vdi 

.globl rotate,dist,zobs 

.globl matrixll,matrixl2,matrixl3 

.globl matrix21,matrix22,matrix23 

.globl matrix31,matrix32,matrix33 

.globl xrotate,yrotate,zrotate,matinit,inkey 

.globl mouse_on,mouse_off,printf 

.globl clipxule,clipyule,clipxlri,clipylri 

.globl filstyle,filindex,filform,filcolor,filmode,yrot 

.globl lineavar,pageup,pagedown,plotpt 


123 


ST 3D Graphics 


Abacus Software 


******************************************************************** 

* Program initialization and storage requirement calculations * 
******************************************************************** 

.text 

sstart: 


move.1 

a7, a5 

* 

Base page address on the stack 

move.1 

4 (a5),a5 

* 

basepage address = program start - $100 

move.1 

$c(a5),dO 

* 

Program length 

add. 1 

$14(a5),dO 

* 

Length of initialized data area 

add. 1 

$lc{a5),d0 

* 

Data area not initialized 

add. 1 

#$1100,dO 

* 

4 K-byte user stack 

move.1 

a5, dl 

* 

Start address of the program 

add. 1 

dO, dl 

* 

Plus number of occupied bytes = space requirement 

and. 1 

#-2,dl 

* 

Even address for stack 

move.1 

dl, a 7 

* 

User stack pointer to last 4K- byte 

move.1 

dO,-(sp) 

* 

Length of reserved area 

move.1 

a5,-(sp) 

* 

Beginning address of reserved area 

move.w 

dO, -(sp) 

* 

Dummy-word 

move.w 

#$4a,-(sp) 

* 

GEM DOS function SETBLOCK 

trap 

#1 



add. 1 

#12,sp 

* 

Restore old stack address 

jsr 

startl 

* 

Check on display address 

jsr 

inlinea 

* 

Initialize Line-A routines 

jsr 

main 

* 

Jump to main program (user-created) 

move.1 

#0,- (a7) 

* 

End current program 

trap 

#1 

* 

Back to Gem desktop 


*********************************************************************** 

* Pass upper screen page to video controller * 

* while drawing the other * 

*********************************************************************** 


pageup: 


move.w 

#-l,-(a7) 



move.1 

physbase,-(a7) 

* Page 

displayed 

move.1 

logbase,- (a7) 

* Draw 

on this page 

move.w 

#5,- (a7) 



trap 




add. 1 

#12,a7 



rt s 





124 


Abacus Software 


ST 3D Graphics 


*********************************************************************** 

* Display screen page at lower address, while all drawing * 

* operations after the call go to the higher display * 

*********************************************************************** 


pagedown: move.w 

#-l,-(a7) 


move.1 

logbase,- (a7) 

* display logical page 

move.1 

physbase,-<a7) 

* draw in the other one 

move. w 

#5,-(a7) 


trap 

Pb 


add. 1 

#12,a7 


rts 




*********************************************************************** 

* This subroutine calls AES functions, the user must * 

* save the Registers D0-D2 and A0-A2 before the aes call, * 

* which are used by VDI and AES * 

*********************************************************************** 


aes: 


move.1 
move.w 
trap 
rts 


#aespb,dl 


#$c8,dO 

dp 


* call the AES functions 


* call the VDI functions * 


vdi: 


move.l #vdipb,dl * call the VDI functions 

move.w #$73,dO 

trap (^#2^? 

rts 


125 


ST 3D Graphics 


Abacus Software 


*********************************************************************** 

* initialize the Line-A functions, pass the address of * 

* Line-A variable area in AO, which is then stored * 

* in lineavar * 

*********************************************************************** 


.dc.w 

$a000 

move.1 

aO,lineavar 

move. w 

#0,32(aO) 

move.w 

#$ffff,34(aO) 

move.w 

#0,36 (aO) 

move.w 

rts 

#1,24 <a0) 


* announces application * 


apinit: 


clr. 1 

dO 

move. 1 

dO,aplresv 

move.1 

dO,ap2resv 

move.1 

dO,ap3resv 

move.1 

dO,ap4resv 

move.w 

#10,opcode 

move.w 

#0,sintin 

move.w 

#1,sintout 

move.w 

#0,saddrout 

move.w 

#0,saddrin 

jsr 

aes 

rts 



* announces an application 


A********************************************************************** 

* Transfers desktop screen handler to caller * 

*********************************************************************** 


grafhand: 


move.w #77,contrl 

move.w #0,contrl+2 

move.w #5,contrl+4 

move.w #0,contrl+6 

move.w #0,contrl+8 


* Transfer screen handler 


126 



Abacus Software 


ST 3D Graphics 


jsr aes 

move.w intout,grhandle 

rts 


* open a workstation * 


openwork: move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move.w 
move„w 
jsr 
rts 


#100,opcode 
#1, dO 

#0,contrl+2 

#11,contrl+6 

grhandle,contrl+12 

dO,intin 

dO,intin+2 

dO,intin+4 

dO,intin+6 

dO,intin+8 

dO,intin+10 

dO,intin+12 

dO,intin+14 

dO,intin+16 

dO,intin+18 

#2,intin+20 

vdi 


* opens a workstation 




* Clear the screen 


clwork: 


move.w 

#3,contrl 

move.w 

#0,contrl+2 

move.w 

#1,contrl+6 

move.w 

grhandle,contrl+12 

jsr 

vdi 

rts 



* clear screen VDI function 


127 


ST 3D Graphics 


Abacus Software 


* Enable mouse * 


mouse on: 


move.w 

#122,contrl 

* enable mouse 

move. w 

#0,contrl+2 

* and control with 

move. w 

#1,contrl+6 

* operating system 

move.w 

grhandle,contrl+12 


move.w 

#0,intin 


jsr 

vdi 


rts 




* Disable mouse * 


mouse off: 


move.w 

#123,contrl 

* Disable mouse 

move. w 

#0,contrl+2 

* and control 

move.w 

#0,contrl+6 


move.w 

grhandle,contrl+12 


jsr 

vdi 


rts 




* write string on screen * 


printf: 


move.1 
move.w 
trap 
addq.1 
rt s 


aO,-(a7) 
#9,-(a7) 
#1 

#6,a7 


* write a string 

* whose starting 

* is in AO, on the 

* screen. String 

* must end with a zero. 


* Determine screen address * 


start 1: 

move.w #2,-{a7) 

trap #14 

addq.1 #2,a7 


* Determine the screen 

* address of the system 

* which computer ? 


128 


Abacus Software 


ST 3D Graphics 


move. 1 
sub. 1 
move.1 
rts 


dO,physbase * screen start minus 32 K-byte 
#$8000,dO 

dO,logbase * equals logical display page 


************************************************************************ 

* Plot routine x-coordinate in d2, y-coordinate in d3 * 

************************************************************************ 


plotpt: 

movem.1 

dO-d2/aO-a2, 

- (a7) 



t st. w 

d2 

* X-value 

less than zero => 


bmi 

stop2 




tst. w 

d3 

* Y-value 

less zero 


bmi 

stop2 




cmp.w 

#639,d2 

* X-value 

greater than 639? 


bhi 

stop2 

* Display 

limit 


cmp.w 

#399,d3 

* Y-value 

greater than 399? 


bhi 

stop2 




move .w 

d2,ptsin 




move. w 

d3,ptsin+2 




move. w 

#1,intin 




.dc. w 

$a001 




movem. 1 

(a7) +,d0-d2/a0-a2 


stop2: 

rts 





********************************************************************** 

* draw-line routine with Cohen-Sutherland clipping. The points are * 

* passed in d2, d3 (start point) and a2, a3 (end point) 
********************************************************************** 


drawl: 


movem.1 

d0-d7/a0-a6,-(a7) 

move.w 

d2,d6 

move.w 

d3,d7 

jsr 

rel_pos 

move.w 

dl,codel 

move.w 

a2,d6 

move.w 

a3,d7 

jsr 

rel_pos 

move.w 

dl,code2 

tst. w 

dl 

bne 

testwl 


* Save registers 

* Determine position 

* of start point and 

* store 

* Position of second 

* point and store 

* if points are not in 

* drawing area continue 


129 


ST 3D Graphics 


Abacus Software 


* 

testwl: 


testw2:, 


testw3: 


tst. w 

codel 

* 

test. Otherwise test 

beq 

drawit2 

* 

first point. When visible. 



* 

draw both points 

move.w 

dl, dO 

* 

If both points on the same 

and. w 

codel,dO 

* 

'page' outside the viewing 

bne 

drawend 

* 

window, then do not draw. 

move.w 

d2,a0 

* 

else store starting points and 

move.w 

d3, al 

* 

calculate intersecting points 

move.w 

a2, a4 



move.w 

a3, a5 



tst.w 

code2 

* 

is point 2 visible ? 

bne 

testw2 

* 

if not, find intersection point 

move.w 

a2,rightx 

* 

if yes, store 

move. w 

a3,righty 



bra 

testw3 

* 

find left intersect point 

move.w 

codel,plcode 

* 

right intersect point 

move.w 

code2,p2code 



jsr 

fndpoint 

* 

find intersect point 

tst. w 

plcode 

* 

if 'intersect point'not 

bne 

drawend 

* 

visible, then end 

move.w 

d2,rightx 

* 

if visible, then store 

move.w 

d3,righty 



move.w 

a4,d2 

* 

and the left intersect point 

move. w 

a5, d3 

* 

with switched points 

move.w 

aO, a2 

* 

determine with the same routine 

move.w 

al, a3 



move.w 

code2,plcode 



move.w 

codel,p2code 



tst. w 

p2code 

★ 

Point visible? 

bne 

testw4 

* 

if not, continue test 

move.w 

a2,leftx 

★ 

if yes, store and 

move. w 

a3,lefty 

* 

connect both visible 

bra 

drawitl 

* 

points with a line 


130 


Abacus Software 


ST 3D Graphics 


testw4: 

jsr 

fndpoint 

★ 

Find intersect point 


move. w 

d2,leftx 

★ 

and store. 


move. w 

d3,lefty 



drawitl: 

move. w 

leftx,d2 

* 

connect both points with 


move. w 

lefty,d3 

* 

a line 


clr. 1 

a2 




clr. 1 

a3 




move. w 

rightx,a2 




move.w 

righty,a3 



drawit2: 

move.1 

lineavar,aO 




move. w 

d2,38 <a0) 

* 

XI 


move.w 

d3,40 (aO) 

★ 

Y1 


move.w 

a2,42(aO) 

* 

X2 


move.w 

a3,44(aO) 

* 

Y2 


.dc .w 

Sa003 

* 

Draw line 

drawend: 





endit: 

movem.1 

(a7)+,d0-d7/a0-a6 

★ 

Restore registers 


rts 


* 

Return to calling program 


********************************************************************** 

* recognizes the position of a point passed in D6 and D7 relative * 

* to the clip window defined in the variables clipoli and clipure * 
********************************************************************** 


clr. 1 

dl 

* 

determines the position 

move. w 

d7,dl 

* 

of the point passed in 

sub. w 

clipyule,dl . 

* 

d6 and d7 relative to 

lsl.l 

#1, dl 

* 

the drawing window 

move.w 

d7, dl 

* 

defined by clipure 

sub. w 

clipylri,dl 

* 

and clipoli 

neg. w 

dl 



lsl.l 

#1, dl 



move.w 

d6, dl 



sub. w 

clipxlri,dl 



neg. w 

dl 



lsl.l 

#1, dl 



move.w 

d6, dl 



sub. w 

clipxule,dl 



lsl.l 

#1, dl 




131 



ST 3D Graphics 


Abacus Software 


swap dl 

rts 


********************************************************************** 

* Finds the intersect point, if present, * 

* of the the connecting line from Pi to P2 with the clip window * 

* the points are passed in D2, D3 and A2, A3 as in drawl * 

********************************************************************** 


fndpoint: 


findwl: 


move.w 

d2,d4 

* 

Find the center point of 

move. w 

d3,d5 

* 

the line PI P2 

add. w 

a2,d4 

* 

{XI + X2) / 2 

ext .1 

d4 



lsr. 1 

#l,d4 



add. w 

a3,d5 

* 

(Y1 + Y2) / 2 

ext .1 

d5 

* 

= center point of line PI P2 

lsr. 1 

#l,d5 



move.w 

d4,d6 

* 

Store center point coord. 

move.w 

d5,d7 

* 

Y middle 

jsr 

rel_pos 

* 

where is the intersect point 

move.w 

p2code,d6 

* 

Code of center pt. to D6 

and.w 

dl, d6 

* 

are the points on the same 

bne 

fother 

* 

page outside the screen 

cmp. w 

d4,d2 

* 

points coincide ? 

bne 

findwl 



cmp.w 

d5,d3 



beq 

fendit 

* 

if yes => stop 

cmp. w 

d4, a2 

* 

Do middle point and second 

bne 

findw2 

* 

point match ? 

cmp. w 

d5,a3 



bne 

findw2 



bra 

fendit 

* 

if yes = stop 


? 


132 


Abacus Software 


ST 3D Graphics 


f indw2: 

move. w 

d4,d2 

* 

else exchange middle and 



move. w 

d5,d3 

* 

first point and start again 



move. w 

dl,plcode 





bra 

fndpoint 




fother: 

cmp - w 

d4,a2 

* 

middle point and P2 match ? 



bne 

fotherl 





cmp. w 

d5, a3 





beq 

fendit 

* 

if yes, then end 


fotherl: 

cmp. w 

d4,d2 

* 

middle point and PI match ? 



bne 

fother2 





cmp. w 

d5,d3 





beq 

fendit 

* 

if yes, then end 


fother2: 

tst. w 

plcode 

★ 

is Pl in clip window 



beq 

fother3 





move.w 

dl,d7 

* 

if not, and Pl and P2 lie 



and. w 

plcode,d7 

* 

both on one side of the 



bne 

fexit 

* 

Clip-window then none of line 

is visible 

fother3: 

move.w 

d4,a2 

* 

otherwise take middle point 



move.w 

d5,a3 

* 

as new P2 and start again 



move.w 

dl,p2code 

* 

until the intersect point 



bra 

fndpoint 

* 

is found 


fexit: 

move.w 

#1,plcode 

* 

Inform calling prog, of termination. 

fendit: 

rts 


* 

either in d2,d3 middle point. 

or 

* 



* 

in plcode termination notice 



****************************************************************** 

* sine and cosine Function, angle is passed in DO and 

* the sine and cosine are returned in Dl and D2 * 

****************************************************************** 


tst. w 

dO 

* 

Angle negative, add 360 degrees 

bpl 

noaddi 



add.w 

#360,dO 



move.1 

#sintab,al 

★ 

Beginning address of sine £able 

move. 1 

d0,d2 

* 

Angle in dO and d2 

lsl. w 

#1, dO 

* 

Angle times two as index for access 

move.w 

0 (al,dO.w),dl 

* 

sine to dl 


133 


ST 3D Graphics 


Abacus Software 



cmp. w 

#270,d2 


bit 

plus9 


sub. w 

#270,d2 


bra 

sendsin 

plus9: 

add.w 

#90,d2 

sendsin: 

lsl. w 

#l,d2 


move.w 

0 (al,d2.w) ,d2 


rt s 



* Calculate cosine through 

* displacement of sine values 

* by 90 degrees 


* cosine to d2 

* 

* and back to calling program 


* sine function * 

* Angle is passed in dO and the sine returned in dl * 


sin: 

move. 1 

#sintab,al 


t st • w 

dO 


bpl 

sinl 


add.w 

#360,dO 

sinl: 

lsl. w 

#1, dO 


move.w 

rts 

0(al,dO.w) 


************************************************************************ 

* Initialize the main diagnonal of the result matrix with * 

* ones which were multiplied by 2 A 14. This subroutine must * 

* be called at least once before the call by rotate, or the * 

* result matrix will only consist of zeros. * 

★★★★A******************************************************************* 


move.w 

#0, dl 




move.w 

#16384,d2 

* 

The 

initial value for 

move.w 

d2,matrixll 

* 

the 

main diagonal of 

move.w 

dl,matrixl2 

* 

the 

result matrix 

move.w 

dl,matrixl3 

* 

all 

other elements 

move.w 

dl,matrix21 

★ 

at zero 

move. w 

d2,matrix22 




move.w 

dl,matrix23 




move.w 

dl,matrix31 




move . w 

dl,matrix32 





134 




Abacus Software 


ST 3D Graphics 


move.w d2,matrix33 
rts 


************************************************************************ 

* Multiplication of the rotation matrix by the rotation 

* matrix for rotation about the X-axis 
************************************************************************ 


xrotate: 


move. w 

xangle,dO 

jsr 

sincos 

move.w 

dl,sinx 

move. w 

d2,cosx 

move.w 

dl, d3 

move.w 

d2,d4 

move.w 

matrixll,rotxll 

move.w 

matrix21,rotx21 

move.w 

matrix31,rotx31 

muls 

matrixl2,d2 

mu Is 

matrixl3,dl 

sub. 1 

dl, d2 

lsl.l 

#2,d2 

swap 

d2 

move. w 

d2,rotxl2 

move. w 

d3, dl 

move. w 

d4,d2 

muls 

matrix22,d2 

muls 

matrix23,dl 

sub. 1 

dl, d2 

lsl.l 

'#2,d2 

swap 

d2 

move.w 

d2,rotx22 

move.w 

d3,dl 

move.w 

d4,d2 

muls 

matrix32,d2 

muls 

matrix33,dl 

sub. 1 

dl, d2 

lsl.l 

#2,d2 

swap 

d2 

move.w 

d2,rotx32 

move.w 

d3, dl 


* multiply matrixll-matrix33 

* with the rotation matrix for a 

* rotation about the X-axis 


* The first column of the matrix 

* does not change with X rotation 


135 



ST 3D Graphics 


Abacus Software 


move. w 

d4,d2 



mu Is 

matrixl2,dl 



mu Is 

matrixl3,d2 



add. 1 

dl, d2 



lsl.l 

#2,d2 



swap 

d2 



move.w 

d2,rotxl3 



move. w 

d3, dl 



move. w 

d4,d2 



mu Is 

matrix22,dl 



mu Is 

matrix23,d2 



add. 1 

dl, d2 



lsl.l 

#2,d2 



swap 

d2 



move.w 

d2,rotx23 



muls 

matrix32,d3 



mu Is 

matrix33,d4 



add. 1 

d3,d4 



lsl.l 

#2,d4 



swap 

d4 



move.w 

d4,rotx33 



move. 1 

irotxll,al 



move.1 

#matrixll,a2 



move.1 

#9,d7 

* Number of matrix elements 

subq.1 

#1, d7 



rotxlopl’: move. w 

(al)+, (a2) + 

* Copy result matrix. 

which 

dbra 

d7,rotxlopl 

* is still in ROTXnn, 

to MATRIXnn 

rts 





*********************************************************************** 

* multiply the general rotation matrix by the Y-axis * 

* rotation matrix. Results are stored in the general * 

* rotation matrix * 

*********************************************************************** 


move. w 

yangle,dO 

* Angle around which 

jsr 

sincos 


move .w 

dl,siny 


move.w 

d2,cosy 


move.w 

dl, d3 

* Sine of Y-angle 

move.w 

d2,d4 

* Cosine of Y-angle 


136 


Abacus Software 


ST 3D Graphics 


mu Is 

matrixll,d2 


mu Is 

matrixl3,dl 


add. 1 

dl, d2 


lsl.l 

#2,d2 


swap 

d2 


move.w 

d2,rotxll 


move.w 

d3, dl 


move.w 

d4, d2 


mu Is 

matrix21,d2 


mu Is 

matrix23,dl 


add. 1 

dl,d2 


lsl.l 

#2,d2 


swap 

d2 


move.w 

d2,rotx21 


move.w 

d3,dl 


move.w 

d4, d2 


muls 

matrix31,d2 


muls 

matrix33,dl 


add. 1 

dl, d2 


lsl.l 

#2,d2 


swap 

d2 


move.w 

d2,rotx31 


neg.w 

d3 


move. w 

d3, dl 

* -siny in the rotation matrix 

move .w 

d4,d2 


move. w 

matrixl2,rotxl2 


move. w 

matrix22,rotx22 

* The second column 

move. w 

matrix32,rotx32 

* of the starting 

muls 

matrixll,dl 

* matrix does not 

muls 

matrixl3,d2 

* change 

add. 1 

dl, d2 


lsl.l 

#2,d2 


swap 

d2 


move.w 

d2,rotxl3 


move.w 

d3,dl 


move.w 

d4,d2 


muls 

matrix21,dl 


muls 

matrix23,d2 


add. 1 

dl,d2 


lsl.l 

#2,d2 


swap 

d2 


move.w 

d2,rotx23 



137 



ST 3D Graphics 


Abacus Software 


muls 

matrix31,d3 

muls 

matrix33,d4 

add. 1 

d3,d4 

lsl.l 

#2,d4 

swap 

d4 

move.w 

d4,rotx33 

move.1 

#8, d7 

move.1 

#rotxll,al 

move.1 

#matrixll,a2 

yrotlopl: move.w 

(al)+, <a2)+ 

dbra 

d7,yrotlopl 


rts 


* Address of result matrix 

* Address of original matrix 

* Copy result matrix 

* to the original matrix 


* 2-axis - Rotation matrix multiplications * 


move.w 

zangle,dO 

jsr 

sincos 

move.w 

dl,sinz 

move.w 

d2,cosz 

move.w 

dl,d3 

move.w 

d2, d4 

muls 

matrixll,d2 

muls 

matrixl2,dl 

sub. 1 

dl, d2 

lsl.l 

#2,d2 

swap 

d2 

move.w 

d2,rotxll 

move.w 

d3, dl 

move.w 

d4,d2 

muls 

matrix21,d2 

muls 

matrix22,dl 

sub. 1 

dl, d2 

lsl.l 

#2,d2 

swap 

d2 

move. w 

d2,rotx21 

move. w 

d3, dl 

move.w 

d4,d2 

muls 

matrix31,d2 

muls 

matrix32,dl 

sub. 1 

dl, d2 


138 



Abacus Software 


ST 3D Graphics 


zrotlopl 


lsl.1 

#2,d2 



swap 

d2 



move.w 

d2,rotx31 



move.w 

d3, dl 



move.w 

d4, d2 



mu Is 

matrixll,dl 



mu Is 

matrixl2,d2 



add. 1 

dl,d2 



lsl.l 

#2, d2 



swap 

d2 



move.w 

d2,rotxl2 



move.w 

d3, dl 



move. w 

d4,d2 



mu Is 

matrix21,dl 



mu Is 

matrix22,d2 



add. 1 

dl, d2 



lsl.l 

#2, d2 



swap 

42 



move. w 

d2,rotx22 



mu Is 

matrix31,d3 



mu Is 

matrix32,d4 



add. 1 

d3,d4 



lsl.l 

#2,d4 



swap 

d4 



move.w 

d4,rotx32 



move. w 

matrixl3,rotxl3 

* 

the third column 

move.w 

matrix23,rotx23 

* 

remains 

move.w 

matrix33,rotx33 

* 

unchanged 

move . 1 

#8,d7 



move.1 

trotxll,al 



move.1 

#matrixll, a2 



: move.w 

(al)+,(a2)+ 

* 

copy to general 

dbra 

d7, zrotlopl 

* 

rotation matrix 


rts 


139 



ST 3D Graphics 


Abacus Software 




* Multiply every point whose Array address is in datx etc. * 

* by previous translation of the coordinate source to * 

* point [offx,offy,offz], with the general rotation matrix. * 

* The coordinate source of the result coordinates is then * 

* moved to point [xoffs,yoffs,zoffs] * 




rotate: 


rotatel: 


move.w 

nummark,dO 

* Number of points to be 

ext. 1 

dO 

* transformed as counter 

subq.1 

#1, dO 


move.1 

datx,al 


move.1 

daty,a2 


move.1 

datz,a3 


move.1 

pointx,a4 


move.1 

pointy,a5 


move.1 

pointz,a6 


move.w 

(al)+,dl 

* X-coordinate 

add.w 

offx,dl 


move.w 

dl, d4 


move.w 

(a2)+,d2 

* Y-coordinate 

add.w 

offy,d2 

* Translation to point [offx,offy,offz] 

move.w 

d2,d5 


move.w 

(a3)+,d3 

* Z-coordinate 

add.w 

offz,d3 


move.w 

d3,d6 


muls 

matrixll,dl 


mu Is 

matrix21,d2 


muls 

matrix31,d3 


add. 1 

dl, d2 


add. 1 

d2,d3 


lsl.l 

#2,d3 


swap 

d3 


add.w 

xoffs,d3 


move. w 

d3,(a4)+ 

* rotated X-coordinate 

move. w 

d4, dl 


move.w 

d5,d2 


move.w 

d6,d3 


muls 

matrixl2,dl 




Abacus Software 


ST 3D Graphics 


mu Is 

matrix22,d2 

mu Is 

matrix32,d3 

add. 1 

dl,d2 

add. 1 

d2,d3 

lsl.l 

#2,d3 

swap 

d3 

add. w 

yoffs,d3 

move . w 

d3,(a5)+ 

mu Is 

matrixl3,d4 

mu Is 

matrix23,d5 

mu Is 

matrix33,d6 

add. 1 

d4,d5 

add. 1 

d5, d6 

lsl.l 

#2,d6 

swap 

d6 

add. w 

zoffs,d6 

move. w 

d6,(a6)+ 

dbra 

rts 

dO,rotatel 


* rotated Y-coordinate 


* rotated Z-coordinate 


************************************************************************ 

* Perspective, calculated from the transformed points in the arrays * 

* pointx, pointy an d point z the screen coordinates, which * 

* are then stored in the arrays xplot and^plot . * 

************************************************************************ 


move. 1 

pointx,al 

* 

Beginning address of 

move. 1 

pointy,a2 

* 

Point arrays 

move.1 

pointz,a3 



move.1 

xplot,a4 

* 

xplot contains start address of the 

move.1 

yplot,a5 

* 

display coordinate array 

move.w 

nummark,dO 

* 

Number of points to be transformed 

ext .1 

dO 

* 

as counter 

subq.1 

#1, dO 



move.w 

(a3)+, d5 

★ 

z-coordinate of object 

move.w 

d5,d6 



move. w 

dist,d4 

* 

Enlargement factor 

sub. w 

d5,d4 

★ 

dist minus Z-coordinate of Obj.coord 


141 



ST 3D Graphics 


Abacus Software 


persl: 


perendl: 


ext. 1 

d4 



lsl.l 

#8,d4 


* times 256 for value fitting 

move. w 

zobs,d3 


* Projection center Z-coordinates 

ext. 1 

d3 



sub. 1 

d6,d3 


* minus Z-coordinate of object 

bne 

persl 



move. w 

#0, dl 


* Catch division by zero 

addq.1 

#2,al 


* Not really required since 

addq.1 

#2,a2 


* computer catches this 

move.w 

dl,(a4)+ 


* with an interrupt 

move.w 

dl,(a5)+ 



bra 

perendl 



divs 

d3,d4 



move.w 

d4,d3 



move.w 

(al)+,dl 

* 

X-coordinate of object 

move.w 

dl,d2 



neg. w 

dl 



muls 

dl,d3 

* 

multiplied by perspective factor 

lsr.l 

#8,d3 

★ 

/256 save value range fitting 

add.w 

d3,d2 

* 

add to X-coordinate 

add.w 

x0,d2 

* 

add screen offset (center point) 

move. w 

d2,(a4)+ 

* 

Display X-coordinate 

move.w 

(a2)+,dl 

* 

Y-coordinates of object 

move.w 

dl, d2 



neg. w 

dl 



muls 

dl, d4 



lsr. 1 

#8,d4 

* 

/256 

add. w 

d4,d2 



neg. w 

d2 

* 

Display offset, mirror of Y-axis 

add.w 

y0,d2 

* 

Source at [XO,YO] 

move.w 

d2,(a5)+ 

* 

Display Y-coordinate 

dbra 

dO, perlop 

* 

All points transformed ? 

rt s 


★ 

If yes, return 


142 


Abacus Software 


ST 3D Graphics 


•dr***************************************************************** 

* Draw number of lines from array from lines in linxy * 

****************************************************************** 


drawnl: 


drlop: 


move.1 

xplot,a4 

* 

Display X-coordinate 

move.1 

yplot,a5 

* 

" Y-coordinate 

move. w 

numline,dO 

* 

Number of lines 

ext .1 

dO 



subq.1 

#1, dO 

* 

as counter 

move.1 

linxy,a6 

* 

Address of line array 

move.1 

(a6) +,dl 

* 

first line , (PI,P2) 

subq.w 

#l,dl 

* 

fit to list structure 

lsl.w 

#1, dl 

* 

times list element length (2) 

move.w 

0(a4,dl.w),d2 

* 

X-coordinate of second point 

move.w 

0(a5,dl.w),d3 

* 

Y-coordinate of second point 

swap 

dl 

* 

same procedure for first point 

subq.w 

#1, dl 



lsl.w 

#1, dl 



move.w 

0(a4,dl.w),a2 

* 

X-coordinate of first point 

move.w 

0(a5,dl.w),a3 

* 

Y-coordinate of first point 

jsr 

drawl 

* 

draw line from P2 to P2 

dbra 

dO,drlop 

* 

All lines drawn ? 

rts 





*********************************************************************** 

* simple counting loop * 

*********************************************************************** 

waitl dbra dO,waitl * delay loop, counts dO register 

rts * down to -1 

*********************************************************************** 

* wait for key press, for Test and Error detection * 

*********************************************************************** 

wait: move.w #l,-(a7) * wait for key activation 

trap #1 * GEM DOS call 

addq.l #2,a7 

rts 


143 


ST 3D Graphics 


Abacus Software 


*********************************************************************** 

* Key sensing, ASCII code returned in lower byte word of DO * 

* Scan code in upper sord lower byte of DO * 

* Returns zero if no input * 

*********************************************************************** 


move.w 

#2,-(a7) 

* Key sensing, does not 

move.w 

#1,- (a7) 

* wait for a key 

trap 

#13 

* press 

addq.1 

#4, a7 


tst. w 

dO 


bpl 

endkey 


move.w 

#7,-{a7) 


trap 

#1 


addq.1 

#2,a7 



endkey: rts 


** The six following subroutines are only required ** 
** for the second main program and do not have to be ** 
** entered for linking to the first main program ** 


filstyle: 


filindex: 


move. w 

#23,contrl 

* 

VDI function, set 

move.w 

#0,contrl+2 

* 

fill style passed 

move. w 

#1,contrl+6 

★ 

in DO 

move. w 

grhandle,contrl+12 



move. w 

dO,intin 



jsr 

vdi 



rts 




movem.1 

dO-d2/aO-a2,- (a7) 

* 

set fill pattern 

move. w 

#24,contrl 

* 

also passed in DO 

move.w 

#0,contrl+2 



move.w 

#1,contrl+6 



move -w 

grhandle,contrl+12 



move.w 

dO,intin 




144 








Abacus Software 


ST 3D Graphics 


filcolor: 


filmode: 


filform: 


jsr 

vdi 

raovera.1 

{a 7)+ ,d0-d2/a0-a2 

rts 


move. w 

#25,contrl 

move. w 

#0,contrl+2 

move. w 

#1,contrl+6 

move.w 

grhandle,contrl+12 

move.w 

#1,intin 

jsr 

vdi 

rts 


move.w 

#32,contrl 

move.w 

#0,contrl+2 

move.w 

#1,contrl+6 

move.w 

grhandle,contrl+12 

move.w 

dO,intin 

jsr 

vdi 

rts 


move. w 

#104, contrl 

move.w 

#0, contrl + 2 

move.w 

#1,contrl+6 

move.w 

grhandle,contrl+12 

move.w 

#1,intin 

jsr 

vdi 

rts 



* set fill color to 


* one 


* set write mode 


* passed in DO 


* switch on border 

* around area 


********************************************************************* 

* Rotation of a number of points (nummark) in array datx etc. around* 

* angle yangle around Y-axis to array pointx = address of array * 

********************************************************************* 


move.w 

yangle,dO 

* 

rotate the definition line 

jsr 

sincos 

* 

of a rotation body nummark 

move. w 

dl,siny 

* 

times about the Y-axis 

move.w 

d2,cosy 

* 

Rotation is done without 

move.1 

datx,al 

* 

matrix multiplication. 

move.1 

daty,a2 

* 

but directly, from arrays datx 

move.1 

datz,a3 

* 

in which the address of the definition 

move.1 

pointx,a4 

* 

line was stored into the array 


145 




ST 3D Graphics 


Abacus Software 


move.1 

pointy,a5 

* whose address is stored 

move.1 

pointz,a6 

* in pointx etc. 

move . w 

nummark,dO 


ext. 1 

dO 

* the rotation is about 

subq.1 

#1, dO 

* angle -y, i.e. from direct: 

move.w 

(al)+,dl 

* positive Y-axis 

move.w 

dl,d3 

* counterclockwise 

move.w 

(a3)+,d2 


move.w 

d2,d4 

* z' = x*siny + z*cosy 

mu Is 

cosy,d2 


lsl.l 

#2, d2 

* retract area extension 

swap 

d2 

* sine values 

mu Is 

siny,dl 


lsl.l 

#2, dl 


swap 

dl 


add. w 

dl,d2 


move. w 

d2,(a6)+ 

* store z' 

mu Is 

siny,d4 

* calculate x' 

lsl.l 

#2,d4 

* x' = x*cosy - z*siny 

swap 

d4 


neg. w 

d4 


mu Is 

cosy,d3 


lsl.l 

#2,d3 


swap 

d3 


add. w 

d3,d4 


move.w 

d4, (a4) + 

* store x' 

move.w 

(a2) +, (aS) + 

* y' = y, since rotation is 

dbra 

dO,ylop 

* around Y-axis 

rts 




* Variables for the basic program * 


• even 

.data * Sine table starts here 


sintab: .dc.w 
.dc. w 
. dc. w 


0,286,572,857,1143,1428,1713,1997,2280 
2563,2845,3126,3406,3686,3964,4240,4516 
4790,5063,5334,5604,5872,6138,6402,6664 


146 



Abacus Software 


ST 3D Graphics 


.dc.w 
. dc. w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 

• dc.w 
.dc.w 

.dc.w 

.dc.w 

.dc.w 

.dc.w 

-dc.w 

• dc.w 

• dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 

.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc. w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 

• dc.w 
.dc.w 
.dc.w 
.dc.w 


6924,7182,7438,7692,7943,8192,8438,8682 
8923,9162,9397,9630,9860,10087,10311,10531 
10749,10963,11174,11381,11585,11786,11982,12176 
12365,12551,12733,12911,13085,13255,13421,13583 
13741,13894,14044,14189,14330,14466,14598,14726 
14849,14962,15082,15191,15296,15396,15491,15582 
15668,15749,15826,15897,15964,16026,16083,16135 
16182,16225,16262,16294,16322,16344,16362,16374 
16382,16384 

16382,16374,16362,16344,16322,16294,16262,16225 
16182 

16135,16083,16026,15964,15897,15826,15749,15668 
15582,15491,15396,15296,15191,15082,14962,14849 
14726,14598,14466,14330,14189,14044,13894,13741 
13583,13421,13255,13085,12911,12733,12551,12365 
12176,11982,11786,11585,11381,11174,10963,10749 
10531,10311,10087,9860,9630,9397,9162,8923 
8682,8438,8192,7943,7692,7438,7182,6924 
6664,6402,6138,5872,5604,5334,5063,4790 
4516,4240,3964,3686,3406,3126,2845,2563 
2280,1997,1713,1428,1143,857,572,286,0 


-286,-572,-857,-1143,-1428,-1713,-1997,-2280 

-2563,-2845,-3126,-3406,-3686,-3964,-4240,-4516 

-4790,-5063,-5334,-5604,-5872,-6138,-6402,-6664 

-6924,-7182,-7438,-7692,-7943,-8192,-8438,-8682 

-8923,-9162,-9397,-9630,-9860,-10087,-10311,-10531 

-10749,-10963,-11174,-11381,-11585,-11786,-11982 

-12176 

-12365,-12551,-12733,-12911,-13085,-13255,-13421 

-13583 

-13741,-13894,-14044,-14189,-14330,-14466,-14598 
-14726 

-14849,-14962,-15082,-15191,-15296,-15396,-15491 
-15582 

-15668,-15749,-15826,-15897,-15964,-16026,-16083 
-16135 

-16182,-16225,-16262,-16294,-16322,-16344,-16362 

-16374,-16382,-16384 


147 


ST 3D Graphics 


Abacus Software 


.dc.w 

-16382,-16374,-16362,-16344, 

-16322,-16294,' 

-16262 

. dc. w 

-16225,-16182 



.dc.w 

-16135,-16083,-16026,-15964, 

-15897,-15826, 

-15749 

.dc. w 

-15668 



.dc. w 

-15582,-15491,-15396,-15296, 

-15191,-15082, 

-14962 

• dc. w 

-14849 



. dc. w 

-14726,-14598,-14466,-14330, 

-14189,-14044, 

-13894 

.dc.w 

-13741 



. dc. w 

-13583,-13421,-13255,-13085, 

-12911,-12733, 

-12551 

.dc.w 

-12365 



.dc.w 

-12176,-11982,-11786,-11585, 

-11381,-11174, 

-10963 

.dc.w 

-10749 



.dc.w 

-10531,-10311,-10087,-9860,- 

9630,-9397,-9162,-8923 

.dc.w 

-8682,-8438,-8192,-7943,-7692,-7438,-7182, 

-6924 

.dc.w 

-6664,-6402,-6138,-5872,-5604,-5334,-5063, 

-4790 

.dc.w 

-4516,-4240,-3964,-3686,-3406,-3126,-2845, 

-2563 

.dc.w 

-2280,-1997,-1713,-1428,-1143,-857,-572,-286,0 



.even 




• bss 



xO: 

• ds. w 

1 

* Position of the coordinate origin on 

o 

> 

• ds. w 

1 

* the screen 

zO: 

.ds. w 

1 


zl: 

.ds. w 

1 


linxy 

.ds. 1 

1 

* This is the address of the line array 

nurrmark: 

. ds. w 

1 

* Number of points 

numline: 

-ds. w 

1 

* Number of lines 

pointx: 

. ds. 1 

1 

* Variables of point arrays for world, 

pointy: 

.ds. 1 

1 

* view, and screen coordinates 

pointz: 

• ds. 1 

1 


xplot 

.ds.l 

1 


yplot 

.ds. 1 

1 


datx: 

.ds.l 

1 


daty: 

.ds.l 

1 


datz: 

.ds.l 

1 



148 





Abacus Software 


ST 3D Graphics 


sinx: 

.ds.w 

1 

* Temporary storage for sine and 

sinz: 

.ds.w 

1 

* cosine values 

siny: 

.ds.w 

1 


cosx: 

.ds.w 

1 


cosz: 

.ds.w 

1 


cosy: 

.ds.w 

1 


varl: 

.ds.w 

1 

* general variables 

var2: 

.ds.w 

1 


var3: 

.ds.w 

1 


xangle: 

.ds.w 

1 

* Variables for passing angles 

yangle: 

. ds . w 

1 

* to the rotation subroutine 

zangle: 

.ds.w 

1 


physbase: 

-ds. 1 

1 

* Address of first screen page 

logbase: 

.ds. 1 

1 

* Address of second screen page 


contrl: 

opcode: 

.ds.w 

1 

* Arrays for AES and VDI functions 

* for passing parameters 

sintin: 

.ds.w 

1 


sintout: 

.ds.w 

1 


saddrin: 

.ds.w 

1 


saddrout: 

.ds.w 

1 



.ds.w 

6 


global: 

apversion: 

.ds.w 

1 


apcount: 

.ds.w 

1 


apid: 

.ds.w 

1 


apprivate: 

• ds. 1 

1 


apptree: 

.ds. 1 

1 


aplresv: 

.ds. 1 

1 


ap2resv: 

.ds. 1 

1 


ap3resv: 

. ds . 1 

1 


ap4resv: 

. ds. 1 

1 


intin: 

• ds.w 

128 


ptsin: 

.ds.w 

256 


intout: 

.ds.w 

128 



149 



ST 3D Graphics 


Abacus Software 


ptsout: 

.ds. w 

128 

addrin: 

.ds. w 

128 

addrout: 

. ds. w 

128 

grhandle: 

.ds. w 

1 

lineavar: 

.ds. 1 

1 * Starting address of Line-A var 


. data 


vdipb: 

.dc. 1 

contrl,intin,ptsin,intout,ptsout 

aespb: 

. dc. 1 

contrl,global,intin,intout,addrin,addrout 

leftx: 

.dc. w 

0 

lefty: 

.dc.w 

0 

rightx: 

.dc. w 

0 

righty: 

. dc. w 

0 

plcode: 

.dc.w 

0 

p2code: 

.dc. w 

0 

codel: 

.dc.w 

0 

code2: 

.dc.w 

0 

mid_code: 

.dc.w 

0 

clipxule: 

.dc.w 

0 * Clip window variables 

clipyule: 

.dc.w 

0 

clipxlri: 

.dc.w 

639 

clipylri: 

.dc.w 

399 

dist: 

.dc.w 

0 

zobs: 

.dc.w 

1500 

rotxll: 

.dc.w 

16384 * Space here for the result matri 

rotxl2: 

.dc.w 

0 * matrix multiplication 

rotxl3: 

.dc.w 

0 

rotx21: 

.dc.w 

0 

rotx22: 

.dc.w 

16384 

rotx23: 

.dc.w 

0 

rotx31: 

.dc.w 

0 

rotx32: 

.dc.w 

0 

rotx33: 

.dc.w 

16384 


.bss 


150 






Abacus Software 


ST 3D Graphics 


matrixll: 
matrixl2: 
matrixl3: 
matrix21: 
matrix22: 
matrix23: 
matrix31: 
matrix32: 
matrix33: 


* Space here for the general 

* rotation matrix 


Desk File View Options 


253882 butes used 1 


K PRINTERS 
X TUTORIAL 
C FKY 

COM TTP 
KLIB PRG 
OUTPUT PRG 
SPLIT TTP 
STANDARD PRT 
TEXTPRO PRG 
TUTORIAL TXT 
XTTUTORI TOC 


a 

I 


nmiffiiM 0 


1442236 butes used in 128 itens. 
BASIC PRG 138944 li-20-Ul 

BASIC RSC 4648 11-20 i] 

BASIC HRK 346 11-20- 

BASIC1 BAR 14801 11-20 


OPEN APPLICATION 

Name: BATCH .TTP 
Parameters: . 

aslink grllnkl housel|__- 


OK I I Cancel 


1 


IJI 


IkJUl 


F:\3DUORK.DIRS 


333956 bytes used In 


ASLINK1 BAT 
BASIC1 S 
GRLIHK BAT 
BRLINK1 0 
6RLINK1 S 
6R0UND1 S 
HIDE1 PRG 
HIDE1 S 
HOUSE1 PRG 
H0USE1 S 
HAIN1 PRG 
HAIN1 S 
HAIN1C0 PRG 
MAIN1C0 S 























ST 3D Graphics 


Abacus Software 


4.1.1 Explanation of the subroutines used 


grlinkl.s 

The transfer of addresses of all data, coordinates, number of corners and 
lines is not made directly, but through global variables. This increases 
flexibility and makes it possible to use just one rotation routine. For 
example, the perspective transformation routine (pers) transforms the data 
whose beginning addresses are passed in the variables pointx, 
pointy, pointz and the number of which is passed in the variable 
nummark, in an array, whose starting address is also passed 
(xplot, yplot). Because of this it does not matter where data is stored 
in memory and the amount is irrelevant. For example, the transformation 
can be carried out for all defined points or only for a few. The brief 
overview which follows on the subroutines of the link file grlinkl. s 
should be supplemented with the comments in the program. 


s st art: Initialize the program. 


aes: 


vdi: 


Call a function from the AES library. 
Calls a function from the VDI library. 





ap i n it: Announce an application. 

openwork: Open a logical display. 

gra f hand: Returns the number of this logical display. 

mouse on: Enables the mouse and its controller through the 
^ — operating system. 

mouse_of f: Switches off mouse and controller. 

sincos: Returns the sine (Dl) and cosine value (D2) of an 

angle (-360,+360) passed in DO. 

st art 1: Asks for the display address of the system and 

recognizes what screen resolution is being used; 
this serves to determine the two screen pages. 


152 




Abacus Software 


ST 3D Graphics 


clwork: 

plotpt: 

drawl: 

rel_pos: 

end point: 

matinit: 

xrotate: 

yrotate: 

zrotate: 

Mtoate: 

pers: 


VDI-Function, clears the current logical display. 

Plots a point, X-coordinate in D2, Y-coordinate in 
D3. 

Draws a line from XI, Y1 to X2,Y2 taking the 
Clip window specified by the variables clipule, 
cliplre into account using the line-A routine. 

Recognizes the area in which the point passed in 
D6 (X-coord.) and D7 (Y-coord.) lies relative to 
the clip window. The result is returned in D1 (4-bit 
code). 

Finds, if present, an intersection point of the line 
with the border of the clip window. 

Initializes the main diagonal of the rotation matrix 
(matrixll-matrix33) with 16384 which 
corresponds to a sine value of one. 

Multiplies the rotation matrix by the matrix for 
one rotation about the X-axis. 

Multiplies matrix with the matrix for rotation 
about the Y-axis. 

Same for Z-axis. 

This is the general rotation routine. Here every 
point from the point array (passed in point x etc.) 
is rotated around the angles xw, yw, zw, and then is 
moved to point [xoffs, yoffs, zoffs] after a 
preliminary displacement of the coordinate origin 
to point [of fx, of fy, of f z], 

Calculates the perspective screen coordinates and 
stores them at addresses passed in xplot, 
yplot. 


153 



ST 3D Graphics 


Abacus Software 


symbol: 

Connects the points in the screen coordinate array 
with lines. The address of the line array is in 
linxy, and the number of lines in numlin. 

— pagedown: 

Turns on the logical screen page. After the call 
drawing is done on the other page. 

page up: 

Turns on the physical (higher) display page. 
Subsequent drawing is done on the logical page 
(toggle). 

waitl: 

A timer loop which only counts the DO -register 
down to -1. 

wait: 

Waits for a key press and then returns. 

inkey: 

Senses the keyboard without waiting. The ASCII 
and key codes are returned in register D 0. 

printf: 

Writes a string on the display which must be 
terminated with a zero. The address is passed in 


AO. 

This routine, and the five following routines are 
not used by the first main program. It rotates a 
number of points around the Y-axis directly and 
without use of matrix multiplication. 

The VDI function sets the fill style which is passed 
in DO (0=no fill, l=fill with color, 2=fill with dots, 
3=shade, 4=user-defined fill pattern). 

f i 1 index: Sets the various fill patterns according to style 

f ilcolor: Determines the fill color (for monochrome display 
only black or white, l=black). 

f ilmode: Sets the write mode, 1 = replace. 

filform: Subsequent filled surfaces will be surrounded with 

a border after calling this routine. 



yrot: 

5 / 

filstyle: 

\ 


154 



Abacus Software 


ST 3D Graphics 


********************************************************************** 

* housel.s 14.1.1986 * 

* Display a wire-model house Uwe Braun 1985 Version 1.1 * 

* * 
********************************************************************** 

.globl main,xoffs,yoffs,zoffs,offx,offy,offz 

.globl viewx,viewy,viewz 

.globl wlinxy,setrotdp,inp_chan,pointrot 

.text 


main: 


jsr 

apinit 

* 

Announce program 


jsr 

grafhand 

* 

Get screen handler 


jsr 

openwork 

★ 

Announce screen 


jsr 

mouse off 

* 

Turn off mouse 


jsr 

getreso 

* 

which monitor is connected ? 


jsr 

setcocli 

* 

Set clip window 


jsr 

makewrld 

★ 

Create the world system 


jsr 

worldset 

* 

Pass the world parameters 


jsr 

setrotdp 

★ 

initialize obs. ref. point 


jsr 

clwork 

★ 

erase both screen pages 


jsr 

('•"pagedown^ 5 

* 

Display logical screen page , j 

jsr 

clwork 


. 

Input and change parameters' ^ * 


jsr 

inp chan 

★ 



mainlopl: 


]sr 

jsr 

jsr 

jsr 

jsr 

jsr 

jsr 

jsr 

jsr 

jsr 

jsr 



* rotate around obs. ref. point 

* perspective transformation 

* Draw lines in linxy array 


inp_chan 

clwork 


* Display physical screen page 

* Input new parameters 

* erase V^logical,; screen page 




pointrot * Rotate around Rot. ref. point 

pers * Transform, of new points 

d rawnl _* draw in l ogi cal page, t hen _ 

pagedowp !) * display this logical page 
inp chan- * Input and change parameters 


155 



ST 3D Graphics 


Abacus Software 


jsr 

clwork * 

erase physical page 

jmp 

mainlopl * 

to main loop 

move. 1 

physbase,logbase 

jsr 

(pageup) * 

switch to normal display page 

rts 


back to linkfile, and end 


******************************************************************** 
* Remove all accumulated characters in the keyboard buffer " 

******************************************************************** 


clearbuf: 


clearend: 


move.w 

#$b,-(a7) 

trap 

#1 

addq.1 

#2,a7 

tst. w 

dO 

beq 

clearend 

move.w 

#1, -(a7) 

trap 

#1 

addq.1 

#2,a7 

bra 

clearbuf 

rts 



* Gemdos funct. Character in buffer? 


* If yes, get character 

* If no, terminate 

* Gemdos funct.CONIN 

* repeat until all characters are 

* removed from the buffer 


********************************************************************** 

* Change observation parameters with keyboard sensing * 

* Angle increments, location of the projection plane, etc. 
********************************************************************** 


inp chan: 

jsr 

inkey 


cmp .b 

#' D',dO 


bne 

inpwait 


jsr 

scrdmp 

inpwait: 

swap 

dO 


cmp .b 

#$4d,dO 


bne 

inpl 


addq.w 

#1,ywplus 


bra 

inpendl 

inpl: 

cmp -b 

#$4b,dO 


bne 

inp2 


* Read keyboard, code in DO 

* shift D = print 

* make hardcopy 

* test DO, if 

* Cursor-right 

* if yes, add one to Y-angle 

* increment and continue 

* Cursor-left, if yes, then 

* subtract one from Y-angle 


156 









Abacus Software 


ST 3D Graphics 



subq.w 

#1, ywplus 


bra 

inpendl 

inp2: 

cmp .b 

#$50,dO 


bne 

inp3 


addq. w 

#1,xwplus 


bra 

inpendl 

inp3: 

cmp. b 

#$48,dO 


bne 

inp3a 


subq.w 

#1,xwplus 


bra 

inpendl 

inp3a: 

cmp .b 

#$61,dO 


bne 

inp3b 


subq.w 

#1,zwplus 


bra 

inpendl 

inp3b: 

cmp.b 

#$62,dO 


bne 

inp4 


addq.w 

#1,zwplus 


bra 

inpendl 

inp4: 

cmp.b 

#$4e,dO 


bne 

inp5 


sub. w 

#25,dist 


bra 

inpendl 

inp5: 

cmp.b 

#$4a,dO 


bne 

inp6 


add.w 

#25,dist 


bra 

inpendl 

inp6: 

cmp.b 

#$66,dO 


bne 

inp7 


sub. w 

#15,rotdpz 


bra 

inpendl 

inp7: 

cmp.b 

#$65,dO 


bne 

inplO 


add. w 

#15,rotdpz 


bra 

inpendl 


* increment 

* Cursor-down, if yes 

* then add one to X-angle increment 

* Cursor-up 

* subtract one 

* Undo key 


* Help key 


* plus key on numerical keypad 

* if yes, subtract 25 from location 

* Projection plane (Z-coordinate) 

\ 

* minus key on the numerical keypad 

* 

* if yes, add 25 

* astersisk key on numerical keypad 

* if yes, subtract 15 from rotation 

* point Z-coordinate 

* Make changes 

* Division key on num.keypad 

* add 15 


157 



ST 3D Graphics 


Abacus Software 


inplO: 

cmp .b 

#$44,dO 


bne 

inpendl 


addq. 1 

#4,a7 


bra 

mainend 

inpendl: 

move. w 

hyangle,dl 


add. w 

ywplus,dl 


cmp. w 

#360,dl 


bge 

inpend2 


cmp. w 

#-360,dl 


ble 

inpend3 


bra 

inpend4 

inpend2: 

sub. w 

#360,dl 


bra 

inpend4 

inpend3: 

add.w 

#360,dl 

inpend4: 

move.w 

dl,hyangle 



move . w 

hxangle,dl 


add.w 

xwplus,dl 


cmp.w 

#360,dl 


bge 

inpend5 


cmp.w 

#-360,dl 


ble 

inpend6 


bra 

inpend7 

inpend5: 

sub. w 

#360,dl 


bra 

inpend7 

inpend6: 

add.w 

#360,dl 

inpend7: 

move.w 

dl,hxangle 


move. w 

hzangle,dl 


add.w 

zwplus,dl 


cmp. w 

#360,dl 


bge 

inpend8 


cmp. w 

#-360,dl 


ble 

inpend9 


bra 

inpendlO 

inpend8: 

sub. w 

#360,dl 


bra 

inpendlO 

inpend9: 

add. w 

#360,dl 


* F10 activated ? 

* if yes, jump to 

* program end 

* Rotation angle about Y-axis 

* add increment 

* if larger than 360, then 

* subtract 360 

* is smaller than 360, then 

* add 360 


* proceed in the same manner 

* with the rotation angle about 

* the X-axis 


* store angle 


158 




Abacus Software 


ST 3D Graphics 


inpendlO: move.w dl,hzangle 
rts 


* Initialize the rotation reference point to [0,0,0] * 


move . w 

#0, dl 

* set the start-rotation- 

move . w 

dl,rotdpx 

* datum-point 

move. w 

dl,rotdpy 


move.w 

dl,rotdpz 


move . w 

#0,hyangle 

* Start-rotation angle 

move. w 

#0,hzangle 


move.w 

#0,hxangle 


rts 




* Rotation around one point, the rotation reference point * 


pointrot: move.w 

hxangle,xangle 

move.w 

hyangle,yangle 

move.w 

hzangle,zangle 

move . w 

rotdpx,dO 

move.w 

rotdpy,dl 

move.w 

rotdpz,d2 

move. w 

dO,xoffs 

move.w 

dl,yoffs 

move.w 

d2,zoffs 

neg. w 

dO 

neg. w 

dl 

neg. w 

d2 

move.w 

dO,offx * 

move.w 

dl, of fy 

move.w 

d2,offz 

jsr 

matinit * 

jsr 

zrotate * 

jsr 

yrotate * 

jsr 

xrotate * 

jsr 

rotate * 

rts 



* rotate the world around the angle 

* hxangle, hyangle, hzangle about the 

* rotation reference point 

* add for back transformation. 


subtract for transformation. 

Matrix initialization 
first rotate around Z-axis 
rotate 'matrix' around Y-axis 
then rotate around X-axis 
Multiply points with the matrix. 


159 


ST 3D Graphics 


Abacus Software 


* Creation of the world system from the object data * 


makewrld: 

move.1 

thousdatx, al 

* create the world system by 


move.1 

Ihousdaty,a2 



move.1 

#housdatz,a3 



move.1 

#worldx,a4 



move.1 

#worldy,a5 



move.1 

#worldz,a6 



move.w 

hnummark,dO 



ext .1 

dO 



subq.1 

#1, dO 


makewll: 

move.w 

(al) +, (a4) + 

* copying the house data into 


move.w 

(a2)+, (a5) + 

* world data 


move. w 

(a3)+, (a6) + 



dbra 

dO,makewll 



move . w 

hnumline,dO 



ext. 1 

dO 



subq.1 

U,dO 



move. 1 

thouslin,al 



move . 1 

dwlinxy,a2 


makewl2: 

move. 1 

(al) +, (a2) + 



dbra 

d0,makewl2 



rts 




********************************** 

* Pass the world parameters to the 
********************************** 


worldset: move.1 

#worldx,datx * 

move.1 

#worldy,daty * 

move.1 

#worldz,datz 

move.1 

#viewx,pointx 

move.1 

#viewy,pointy 

move.1 

#viewz,pointz 

move.1 

#wlinxy,linxy 

move.w 

picturex,xO 

move. w 

picturey,yO 

move.w 

proz,zobs 

move.w 

rlzl,dist 

move.1 

#screenx,xplot 


********************************** 

link file variables * 

********************************** 

Pass variables for 
the rotation routine 


160 


Abacus Software 


ST 3D Graphics 


move.1 Iscreeny,yplot 
move.w hnumline,numline 
move.w hnummark,nummark 
rts 

********************************************************************* 

* sense current display resolution and set coordinate origin of the * 

* screen system to the center of the screen * 

********************************************************************* 


getreso: 

move.w 

#4,-(a7) 



trap 

#14 



addq.1 

#2,a7 



cmp.w 

#2, dO 



bne 

getrl 



move. w 

#320,picturex 

* for monochrome monitor 


move.w 

#200,picturey 



bra 

getrend 


getrl: 

cmp.w 

#1, dO 



bne 

getr2 



move. w 

#320,picturex 

* medium resolution (640*200 


move.w 

#100,picturey 



bra 

getrend 


getr2: 

move.w 

#160,picturex 

* low resolultion (320*200) 


move.w 

#100,picturey 


getrend: 

rts 




********************************************************************** 

* Hardcopy of the display after activating Shift d on keyboard * 

********************************************************************** 

scrdmp: move.w #20,-(a7) 

trap #14 

addq.l #2,a7 

jsr clearbuf * prevent another hardcopy 

rts 


161 


ST 3D Graphics 


Abacus Software 


********************************************************************* 

* Sets the limit of the display window for the draw-line algorithm * 

* built into the Cohen-Sutherland clip algorithm * 

* The limits are freely selectable by the user, making the draw- 4 

* line algorithm very flexible. 

********************************************************************* 


move.w 

#0, clipxule 

* 

Clip left X-Coord. 

move.w 

#0,clipyule 

★ 

” Y-Coord 

move. w 

picturex,dl 



lsl. w 

#1, dl 

* 

times two 

subq.w 

#1, dl 

* 

minus one equal 

move.w 

dl,clipxlri 

* 

639 for monochrom 

move.w 

picturey,dl 



lsl. w 

#1, dl 

* 

times two minus one equal 

subq.w 

#1, dl 

* 

399 for monochrom 

move.w 

dl,clipylri 

★ 

Clip right Y-Coord 

rts 





.even 


* Here begins the variable area for the program module * 

* * 

* * 

* Definition of the house * 

* * 

. data 


housdatx: .dc.w 
,dc. w 


-30,30,30,-30,30,-30,-30,30,0,0,-10,-10,10,10 
30,30,30,30,30,30,30,30,30,30,30,30 


housdaty: .dc.w 
.dc.w 
.dc.w 


30,30,-30,-30,30,30,-30,-30,70,70,-30,0,0,-30 

20 , 20 , 0 , 0 , 20 , 20 , 0,0 

-10,-10,-30,-30 


162 










Abacus Software 


ST 3D Graphics 


housdatz: 

.dc.w 


.dc.w 


.dc.w 

houslin: 

.dc.w 


.dc.w 


.dc.w 


.dc.w 

hnummark: 

.dc.w 

hnumline: 

.dc.w 

hxangle: 

.dc.w 

hyangle: 

.dc.w 

hzangle: 

.dc.w 

xwplus: 

.dc.w 

ywplus: 

.dc.w 

zwplus: 

.dc.w 

picturex: 

• dc.w 

picturey: 

.dc.w 

rotdpx: 

.dc.w 

rotdpy: 

.dc.w 

rotdpz: 

.dc.w 


rlzl: 

.dc.w 

normz: 

. dc. w 



.bss 

plusrot: 

. ds. 1 

first: 

.ds. 1 

second: 

. ds . w 

deltal: 

.ds. w 


.data 


60,60,60,60,-60,-60,-60,-60,60,-60,60,60,60,60 
40,10,10,40,-10,-40,-40,-10 
0 ,- 20 ,- 20,0 


1,2,2,3,3, 4,4,1,2,5,5,8,8,3,8,7,7,6,6,5,6,1,7,4 

9, 10, 1, 9, 9, 2,5,10, 6,10, 11,12, 12, 13, 13,14 

15,16,16,17,17,18,18,15,19,20,20,21,21,22,22,19 

23,24,24,25,25,26,26,23 

26 * Number of corner points of the house 

32 * Number of lines of the house 

0 * Rotation angle of the house around X-axis 

0 * " " " Y-axis 

0 * " " " Z-axis 

0 * Angle increment around the X-axis 

0 * Angle increment around the Y-axis 

0 * Angle increment around the Z-axis 

320 * Definition of zero point of display 

200 * here it is in the display center 

0 * Rotation datum point 

0 
0 


0 

1500 


1 

1 

1 

1 


163 


ST 3D Graphics 


Abacus Software 


flag: 

. dc .b 

. even 

-bss 

1 


diffz: 

.ds.w 

1 


dx: 

.ds .w 

1 


dy: 

-ds.w 

1 


dz: 

.ds.w 

1 


worldx: 

.ds.w 

1600 

* World coordinate array 

worldy: 

-ds. w 

1600 


worldz: 

.ds.w 

1600 


viewx: 

.ds.w 

1600 

* View coordinate array 

viewy: 

.ds.w 

1600 


viewz: 

.ds.w 

1600 


screenx: 

.ds.w 

1600 

* Display coordinate array 

screeny: 

.ds.w 

1600 



wlinxy: 

.ds. 1 

3200 

* Line array 


.data 



prox: 

.dc. w 

0 

* Coordinates of the Projection- 

proy: 

.dc. w 

0 

* center, on the positive 

proz: 

. dc. w 

1500 

* Z-axis 


. data 



of fx: 

.dc. w 

0 

* Transformation during Rotation 

of fy: 

. dc. w 

0 

* to point [offx,offy,offz] 

of fz: 

. dc. w 

0 


xoffs: 

.dc.w 

0 

* Back transformation to Point 

yoffs: 

.dc. w 

0 

* [xof yof f s, zof fs] 

zoffs: 

.dc.w 

0 

7 


.bss 



loopc: 

.ds. 1 

1 



• end 




164 


Abacus Software 


ST 3D Graphics 


4.1.2 Description of the Subroutines of the first Main program: 


main: This is the entry point to the program module. The 

program announces itself and initializes the AES 
and VDI functions and senses the current screen 
resolution. The window size and the screen are 
determined from the resolution. The program 
section between the labels mainopl: and mainend: 
is the main loop, which is repeated until the F10 
key is pressed. 

makewrld: Creates a world in the world coordinate system by 
simple copying of the house data into the world 
system. These are the coordinates of the house 
(housdatx, housdaty, housdatz) in the 
world coordinate system (wrldx, wrldy, 
wrldz), the lines of the house in houslin in the 
world line storage area (wlinxy), the number of 
comer points the house (hnummark) in the total- 
number variable of the world system (nummark) 
and finally the number of house lines (hnumline) 
in numline. This subroutine need only be called 
once unless you want to add objects to the world 
system which we will do in a later program. 

wrldset: After creating the world system the array addresses 

(wrldx etc.) must be passed to the global 
variables of the rotation subroutine (datx etc.). 
Furthermore the coordinate origin of the display is 
determined in the Variables XO and YO, and the 
presets for the perspective parameters 
(zobs, dist). 

setrotdp: Initializes the rotation reference point to [0,0,0] 
and the rotation angles to 0 degrees. 


165 


ST 3D Graphics 


Abacus Software 


pointrot: 


inp chan: 


getreso: 


scrdmp: 


setcocli: 


clearbuf: 


This subroutines provides the rotation routine with 
the current data and then performs the rotation 
around the point [rotdpx, rot dp, rotdpz] of 
all three axes with a call to the proper routines of 
the link file, in the sequence Z-axis, Y-axis, X-axis. 
A change in the sequence also changes the results. 

Input and change the parameters, rotation angle, 
rotation reference point and position of the projec¬ 
tion plane. 

Checks the current display resolution and from this 
determines the data for the screen center and the 
clip window, which in this case is the whole visible 
display. 

Hardcopy routine, is called form inp_chan by 
pressing shift ’D’ and replaces the key combination 
Altemate/Help, which the operating system uses to 
make a hardcopy of the screen. Since in this 
program the displayed page is never the same as 
the page in which the drawing occurs, a hardcopy 
through Altemate/Help would not correspond to 
the displayed picture but would print the picture 
under construction or the just-erased display. The 
trick is to call the scrdmp routine before the 
displayed page is erased. 

Set the clip-window for the Cohen-Sutherland clip 
algorithm on the whole display, 0,0 to 639,399 hi¬ 
res, 639,199 med-res, or 319,199 lo-res. 

Remove characters that may be in the keyboard 
buffer. Is used only by the hardcopy routine, since 
several hardcopies could otherwise be made in 
succession (Key repeat). 


166 


Abacus Software 


ST 3D Graphics 


4.1.3 General comments on the program 


The specific explanations of the variables can be found in the remarks in 
the program listing. In each iteration of the main loop the program adds 
an angle increment (xwplus, ywplus, zwplus) to the rotation angle 
(hxangle, hyangle, hzangle) of the house. The input routine 
changes the angle increments which causes the house to rotate faster on 
the screen, though this is really an optical illusion. The end points of the 
house have to travel a longer distance between each drawing operation, 
which causes this effect. The cursor keys, the <Help> and <Undo> keys 
control the rotation, the V and ’-’keys change the display size by 
moving the projection plane, and the ’/’ and ’*’ keys move the rotation 
reference point on the Z-axis. Pressing of the shift and ’D’ keys at the 
same time produces hardcopy if a printer is attached. 

The best thing to do is to try out the various changes possible, preferably 
by changing the constants in the listing. You can, for example move the 
rotation reference point on the X and Y axis, or the variable proz, which 
changes the position of the projection center. The closer you move the 
projection center in the direction of the house, the greater the perspective 
distortion. You should also define an object yourself, and you should start 
with a simple object, like a pyramid. You only have to enter the points of 
the pyramid (in a pyramid with a quadratic base there are five) in place of 
the house coordinates in the arrays (housdatx etc.). Furthermore, the 
number of points (5) must be entered in houslin in hnummark, the 
number of lines (8) in hnumline and then the information regarding 
which points are connected by lines. You only have to change the storage 
area and you can represent any defined object with the same program. 

Here I want to provide some additional information about the storage 
space required. The arrays (wrldx etc., viewx, screenx, 
wlinxy) are already dimensioned quite generously for future expansion. 
You can define objects with 1600 comers and connect these comers with 
3200 lines. About 40 KByte of storage space is needed for this array 
dimensioning. Even though 1600 comers appear to be sufficient at first 
glance, we shall reach this number in the next chapter without too much 
effort. But first of all stop for a while and play around with this program. 
You can also add a window on the other side of the house by simply 
entering the new coordinates. 


167 




LIS 


projection centers 



Abacus Software 


ST 3D Graphics 


4.2 Generation techniques for creating rotating objects c 

\ 1'4,-fc, ? 

If you have experimented with the construction of new objects, you 
probably also noticed the considerable effort involved in construction, 
especially for regularly-formed bodies with many comers. Imagine if you 
had to input the end points of the ball approximated by polygons (See 
figure 4.2.1). 



Figure 4.2.1: Hardcopy of the rotation ball 


The drudgery of input can be performed by the computer for all axis- 
symmetrical objects. As an example, consider the ’’chess piece’’ from 
Figure 4.2.2. This figure can be created by rotating a line (the definition 
line) around any axis, in this case the Y-axis. The programmer must 


169 


ST 3D Graphics 


Abacus Software 


define the one line and indicate how many times it should be rotated. You 
can follow the construction of the figure easily on the following 
hardcopies. The rotation number must be a division of 360 for 
programming reasons or a portion of the figure will be missing. From two 
to four to three hundred sixty rotations are available. More than 180 just 
produces a heap of points on the display (the screen resolution is too 
low). Now the space requirement will become obvious. If you rotate the 
12 points 360 times it results in 4,332 points not to mention the 8,291 
lines created by the rotation. The number of points is calculated as 
follows: nummark: =numpt* (rotations + 1). The lines include the 
connecting lines of the points in the rotating definition line as well as the 
horizontal connecting lines of the points in the rotation line. 

The routines for the creation of the rotation body are contained in the 
listing of the file rotate 1. s. The rotation body is described by a line, 
i.e. a number of points (rlnumpt), whose coordinates are in rlxdat, 
rlydat, r 1 zdat and the number of rotations about the Y-axis which 
this line should perform. The different bodies are created by varying the 
number of rotations. The maximum number of rotations in our case is 
120, which is predetermined by the dimensioning of the array to 1600 etc. 
and of course could be changed. The number of points of the rotation 
body is contained in the variable rlnumpt. The link file remains the 
same as in the first program. You only have to assemble the first file and 
link it to the link file: as link grlinkl rotatel. 


Desk File View Options 


A:\ 


253882 butes used i 

8 PRINTERS 
8 TUTORIAL 
C FKY 

C0NV TIP 
NL1B PRC 
OUTPUT PRC 
SPLIT TTP 
STftNDRRD PRT 
TEXTPRO PRC 
TUTORIRL TXT 
XTTUTORI TOC 


D:\ 


K 


1442236 butes used in 123 ltens. 


BASIC PR6 
BfiSIC RSC 
BASIC HRK 
BASIC1 BAK 


138944 11-28 
4648 11-28: 
346 11-2 
14801 11-2 


F:\3DU0RK.DIRS 


333556 butes used tn 


OPEN APPLICATION 


Nanei BATCH 
Parameters: 
aslink grlinkl rotatei[ 


• TTP 


I OK I ^ | Cancel I 


a* a* a* a? 

WBSTSE23M I'-H'Ji i"?u■ iinn i : *tw ttnm 


H0USE1 PRB 
NQUSE1 S 
MAIN1 PRG 
MAIN1 S 
MAIN1C0 PRC 


HAIN1C0 
HENU1 
MENU1 
MULTIi 
MUL Til 
PAINT1 
PAINT1 
R0TATE1 PRG 
R0TATE1 S 


S 

PRG 

S 

PRG 

S 

PRG 

S 




170 




























Abacus Software 


ST 3D 






ST 3D Graphics 


Abacus Software 


********************************************************************** 

* rotatel.s 16.1.1986 * 

* Creation of rotation bodies Uwe Braun 1985 Version 2.0 * 


.text 

.globl main,xoffs,yoffs,zoffs,offx,offy, offz 

-globl viewx,viewy,viewz 

.globl wlinxy,mouse off,setrotdp,inp chan,pointrot 


main: 


jsr 

apinit 

* 

jsr 

grafhand 

* 

jsr 

openwork 

it 

jsr 

mouse_off 

* 

jsr 

getreso 

* 

jsr 

setcocli 

* 

jsr 

makerotl 


jsr 

makewrld 

* 

jsr 

wrld2set 

* 

jsr 

setrotdp 

* 

jsr 

clwork 


jsr 

pagedown 

* 

jsr 

clwork 


jsr 

inp_chan 

* 


mainlopl: 


jsr 

pointrot 

* 

jsr 

pers 

* 

jsr 

drawnl 


jsr 

pageup 

* 

jsr 

inp_chan 

* 

jsr 

clwork 

* 

jsr 

pointrot 

* 

jsr 

pers 

* 

jsr 

drawnl 


jsr 

pagedown 

* 

jsr 

inp_chan 

* 


Announce program 
Get screen handle 
Display 
Turn off mouse 

Which monitor is connected ? 
Set clip window 


Create world system 
Pass world parameters 

initialize observation ref. point 

Display logical screen page 

Input and change parameters 

rotate around observation ref. point 
Perspective transformation 

Display physical page 

Input new parameters 

Erase logical page 

Rotate around rotation ref. point 

Transform, new points 

Display this logical page 
Input and change 


172 



Abacus Software 


ST 3D Graphics 


mainend: 


jsr 

clwork * 

clear physical page 

jmp 

mainlopl * 

to main loop 

move.1 

physbase,logba: 

se 

jsr 

pageup * 

switch to normal display page 

rts 

* 

back to link file, and end 


* 

* 

* 




**************** 


remove all characters from the keyboard buffer 
******************************************************************* 


clearbuf: move.w 

#$b,-(a7) 

trap 

#1 

addq.1 

#2,a7 

tst -w 

dO 

beq 

clearend 

move.w 

#1,- (a7) 

trap 

#1 

addq.1 

#2,a7 

bra 

clearbuf 

clearend: rts 



* Gemdos funct. char in buffer? 

* if yes, get character 

* if no, terminate 

* Gemdos funct. CONIN 

* repeat until all characters 

* are removed from the buffer 


* Create the rotation body rl 


makerotl: jsr 
jsr 
jsr 
rt s 


rlset 

rotstart 

rotlin 


* Create the rotation body 

* first the coordinates, 

* then the lines 


173 








ST 3D Graphics 


Abacus Software 


*******************it** + -k1t*-k-k**ic1t1r*1i1iii*1t1r1tl!*1cirit**ir1'1c1r1r***1i1t**i'*iiitit1i1r1rit 

* Input and change observation parameters * 

* the angles hxangle,hyangle,hzangle, are rotation angles of * 

* world system * 


inp chan: 

jsr 

inkey 

* 


cmp.b 

#'D',dO 



bne 

inpwait 



jsr 

scrdmp 

* 

inpwait: 

swap 

dO 

* 


cmp.b 

#$4d,dO 

* 


bne 

inpl 



addq. w 

#1,ywplus 

* 


bra 

inpendl 

* 

inpl: 

cmp.b 

#$4b,dO 

* 


bne 

inp2 

* 


subq.w 

#1,ywplus 

* 


bra 

inpendl 


inp2: 

cmp.b 

#$50,dO 

* 


bne 

inp3 



addq.w 

#1,xwplus 

* 


bra 

inpendl 


inp3: 

cmp.b 

#$48,dO 

* 


bne 

inp3a 



subq. w 

#1,xwplus 

* 


bra 

inpendl 


inp3a: 

cmp.b 

#$61,dO 

★ 


bne 

inp3b 



subq.w 

#1,zwplus 

* 


bra 

inpendl 


inp3b: 

cmp.b 

#$62,dO 

* 


bne 

inp4 



addq. w 

#1, zwplus 

* 


bra 

inpendl 



Sense keyboard, code in 

make hardcopy 

test DO if 
Cursor-right 

if yes, add one to Y-angle increment 
and continue 

Cursor-left, if yes 
subtract one from Y-angle 
increment 

Cursor-down, if yes 

add one to X-angle increment 

Cursor-up 
subtract one 

Undo-key 

lower Z-increment 

Help-key 

add to Z-increment 


174 


Abacus Software 


ST 3D Graphics 


inp4: 

cmp .b 

#$4e,dO 

* plus key on keypad 


bne 

inp5 

* if yes, subtract 25 from 


sub. w 

#25,dist 

* position of projection 


bra 

inpendl 

* plane (Z-coordinate) 

inp5: 

cmp.b 

#$4a,d0 

* minus key on keypad 


bne 

inp6 

* 


add.w 

#25,dist 

* if yes, add 25 


bra 

inpendl 


inp6: 

cmp.b 

#$66,dO 

* times-key on the keypad 


bne 

inp7 

* if yes, then subtract 15 


sub. w 

#15,rotdpz 

* from the rotation ref. point Z-coord. 


bra 

inpendl 

* make changes 

inp7: 

cmp.b 

#$65,dO 

* division-key on keypad 


bne 

inplO 



add.w 

#15, rotdpz 

* add 15 


bra 

inpendl 


inplO: 

cmp.b 

#$44,dO 

* F10 activated ? 


bne 

inpendl 



addq.1 

#4,a? 

* if yes, jump to 


bra 

mainend 

* Program end 

inpendl: 

move. w 

hyangle,dl 

* rotation angle, Y-axis 


add.w 

ywplus,dl 

* add increment 


cmp.w 

#360,dl 

* if larger than 360, then subtract 360 


bge 

inpend2 



cmp. w 

#-360,dl 

* if smaller than 360, 


ble 

inpend3 

* add 360 


bra 

inpend4 


inpend2: 

sub. w 

#360,dl 



bra 

inpend4 


inpend3: 

add. w 

#360,dl 


inpend4: 

move. w 

dl,hyangle 



move. w 

hxangle,dl 

* proceeed in the same 


add. w 

xwplus,dl 

* manner with rotation 


cmp.w 

#360,dl 

* angle, X-axis 


bge 

inpend5 



cmp. w 

#-360,dl 



175 


ST 3D Graphics 


Abacus Software 



ble 

inpend6 


bra 

inpend7 

inpend5: 

sub. w 

#360,dl 


bra 

inpend7 

inpend6: 

add. w 

#360,dl 

inpend7: 

move. w 

dl,hxangle 


move. w 

hzangle,dl 


add. w 

zwplus,dl 


cmp. w 

#360,dl 


bge 

inpend8 


cmp. w 

#-360,dl 


ble 

inpend9 


bra 

inpendlO 

inpend8: 

sub. w 

#360,dl 


bra 

inpendlO 

inpend9: 

add.w 

#360,dl 

inpendlO: 

move.w 

rts 

dl,hzangle 


* Initialize the rotation reference point to [0,0,0] * 


move.w 

#0, dl 

* set the start-rotation 

move.w 

dl,rotdpx 

* reference point 

move.w 

dl,rotdpy 


move. w 

dl,rotdpz 


move. w 

#0,hyangle 

* Start rotation angle 

move.w 

#0,hzangle 


move. w 

#0,hxangle 


rts 




****************************************************************** 

* Rotation of the total world system around the rotation * 

* reference point * 

****************************************************************** 


pointrot: move.w 
move.w 
move.w 
move.w 


hxangle,xangle * rotate the world around 
hyangle,yangle 
hzangle,zangle 

rotdpx,d0 * the rotation reference point 


176 


Abacus Software 


ST 3D Graphics 


★ 

makewrld: 


makewll: 


jnakewl2 : 


move.w 

rotdpy,dl 


move . w 

rotdpz,d2 


move. w 

dO,xoffs 

* add for inverse transformation 

move . w 

dl,yoffs 


move.w 

d2,zof fs 


neg. w 

dO 


neg. w 

dl 


neg. w 

d2 


move. w 

dO,offx 

* subtract for transformation 

move. w 

dl, offy 


move. w 

d2,offz 


jsr 

matinit 

* matrix initialization 

jsr 

zrotate 

* rotate around Z-axis first 

jsr 

yrotate 

* rotate 'matrix' around Y-axis 

jsr 

xrotate 

* then rotate around X-axis 

jsr 

rotate 

* multiply points with the 

rts 


* matrix. The Z-axis is not taken into 



* account 

move. 1 

#rldatx,al 

* create the world system 

move . 1 

#rldaty,a2 

* by copying data of rotation body 

move.1 

ffrldatz, a3 

* into world system 

move.1 

#worldx,a4 


move. 1 

#worldy,a5 


move. 1 

#worldz,a6 


move. w 

rlnummark,dO 

* number of corners repeated 

ext .1 

dO 


subq. 1 

#1, dO 


move . w 

(al)+, (a4) + 

* Copy coordinates 

move . w 

(a2)+, (a5) + 

* Y-coords. 

move. w 

(a3)+, (a6) + 

* Z-coords. 

dbra 

dO,makewll 


move.w 

rlnumline,dO 

* Copy the line arrays 

ext. 1 

dO 

* of the rotation body 

subq.1 

#1, dO 

* into the world system 

move.1 

#rllin,al 

* Number of lines as counter 

move.1 

#wlinxy,a2 


move.1 

(al)+,(a2)+ 

* copy lines 

dbra 

dO,makew!2 


rt s 




177 


ST 3D Graphics 


Abacus Software 


*********************************************************************** 
* Pass world parameters to variables of link files * 

*********************************************************************** 


worldset: move.l 

#worldx,datx 

move.1 

fworldy,daty 

move.1 

#worldz,datz 

move.1 

#viewx,pointx 

move.1 

#viewy,pointy 

move.1 

#viewz,pointz 

move.1 

#wlinxy,linxy 

move.w 

picturex,xO 

move.w 

picturey,yO 

move.w 

proz,temp 

move.w 

rlzl,dist 

move.1 

iscreenx,xplot 

move.1 

iscreeny,yplot 

move.w 

hnumline,numline 

move.w 

hnummark,nummark 

rts 



* Passing house variables 

* for the rotation routine 

* and the global subroutine 

* of the link module 


* Projection center Z-coordinate 

* Location of projection plane on 

* the Z-axis 

* Number of house lines 

* Number of house corners 


*********************************************************************** 

* Creation of rotation body in the array, the address of which * 

* is passed in the variables rotdatx, rotdaty, rotdatz * 

*********************************************************************** 

rlset: 


move. 1 

#rlxdat,rotxdat 

★ 

Transmit 

move. 1 

#rlydat,rotydat 

* 

parameters of this 

move.1 

#rlzdat,rotzdat 

★ 

rotation body to 

move.1 

irldatx,rotdatx 

★ 

the routine for 

move.1 

ffrldaty, rotdaty 

* 

creation of the 

move.1 

#rldatz,rotdatz 

* 

rotation body 

move.1 

rotdatx,datx 



move. 1 

rotdaty,daty 



move. 1 

rotdatz,datz 



move. w 

rlnumro,numro 

* 

Number of desired 

move.w 

rlnumpt,numpt 

* 

rotations. Number 

move.l 

#rllin,linxy 

* 

of points in def.line 

rts 


★ 

Address of line array 


178 


Abacus Software 


ST 3D Graphics 


rotstart: 


rloopl: 


move.w 

numpt,dO 

lsl. w 

#1, dO 

ext. 1 

dO 

move.1 

dO,plusrot 

move.w 

numpt,nummark 

move. 1 

rotdatx,pointx 

move.1 

rotdaty,pointy 

move.1 

rotdatz,pointz 

move.w 

#0,yangle 

move.w 

#360,dO 

divs 

numro,dO 

move.w 

dO, plusagle 

move. w 

numro,dO 

ext. 1 

dO 

move.1 

dO,loopc 

move.1 

rotxdat,datx 

move.1 

rotydat,daty 

move.1 

rotzdat,datz 

jsr 

yrot 

move. 1 

pointx,dl 

add. 1 

plusrot,dl 

move. 1 

dl,pointx 

move. 1 

pointy,dl 

add. 1 

plusrot,dl 

move. 1 

dl,pointy 

move. 1 

pointz,dl 

add. 1 

plusrot,dl 

move. 1 

dl,pointz 

move.w 

yangle,d7 

add. w 

plusagle,d7 

move. w 

d7,yangle 

move. 1 

loopc,dO 

dbra 

dO,rloopl 

move. w 

rlnumro,numro 

move.w 

rlnumpt,numpt 

rts 



* Rotate def line 

* numro+1 about Y-axis 


* Pass data array 

* to subroutine yrot 

* 360 / numro = angle increment 

* per rotation 

* numro +1 times 

* as loop counter 

* for passing to yrot 

* rotate 

* add offset to 

* address 


* Add angle increment 

* to rotation angle 

* and rotate line 

* again until all 

* end points are generated. 

* store for following 

* routines for line generation 


179 


ST 3D Graphics 


Abacus Software 


rotlin: 


rotlopl: 


rotlop2: 


rotlop3 : 


* Create the line array of the 


move.w 

#1, d7 

* rotation body 

move.w 

numro,d4 

* Number of rotations repeated 

ext. 1 

d4 


subq. 1 

#1, d4 


move.w 

numpt,dl 


subq.w 

*1, dl 


lsl. w 

#2, dl 


ext. 1 

dl 


move.1 

dl,plusrot 


move.w 

numpt,d5 

* Number of points - 

ext. 1 

d5 

* repeat once 

subq.1 

#2,d5 


move.1 

linxy,al 

* Lines created stored 

move.w 

d7,d6 

* here 

move.w 

d6, (al) + 

* The first line goes from 

addq.w 

#1, dG 

* point one to point two 

move.w 

d6, (al) + 

* (1,2) then (2,3) etc. 

dbra 

d5,rotlop2 


move. 1 

linxy,dl 

* generate cross connections 

add. 1 

plusrot,dl 

* of individual lines 

move.1 

dl,linxy 


move.w 

numpt,dO 


add.w 

d0,d7 


dbra 

d4,rotlopl 


move. w 

numpt,d7 


move.w 

d7,deltal 


lsl. w 

#2,d7 


ext. 1 

dl 


move.1 

d7,plusrot 


move.w 

#l,d6 


move. w 

numpt,dO 


ext. 1 

dO 


subq.1 

#1, dO 


move.w 

numro,dl 


ext. 1 

dl 


subq.1 

#1, dl 


move.w 

d6,d5 



180 


Abacus Software 


ST 3D Graphics 


move.w 

d5, (al) + 

add. w 

deltal,d5 

move.w 

d5,(al)+ 

dbra 

dl,rotlop4 

add. w 

#l,d6 

dbra 

dO,rotlop3 

move. w 

numro,dl 

add. w 

#1, dl 

mul s 

nummark,dl 

move.w 

dl,rlnummark 

move.w 

numpt,dl 

muls 

numro,dl 

move . w 

numpt,d2 

subq.w 

#1, d2 

muls 

numro,d2 

add. w 

dl, d2 

move.w 

rts 

d2,rlnumline 


* Store total number of 

* corners created 


* Total of lines created 


* Pass parameters of the world system to variables * 

* of the link file for the rotation body * 


wrld2set: move.1 

iworldx,datx 

* 

Pass parameter 

of 

move.1 

fworldy,daty 

* 

rotation body ' 

to the 

move.1 

#worldz,datz 

* 

subroutines in 

the link 

move.1 

#viewx,pointx 

* 

module 


move.1 

#viewy,pointy 




move.1 

#viewz,pointz 




move.1 

#wlinxy,1inxy 




move.w 

picturex,xO 




move.w 

picturey,yO 




move. w 

proz,temp 




move.w 

rlzl,dist 




move.1 

Iscreenx,xplot 




move.1 

#screeny,yplot 





181 



ST 3D Graphics 


Abacus Software 


move.w rlnumline,numline * Number of lines 

move.w rlnummark,nummark * Number of corners 

rts 


a********************************************************************** 

* Sense current display resolution and set the coordinate * 

* origin of the screen system to the screen center * 

*********************************************************************** 


getreso: 

move. w 

#4,-(a7) 



trap 

#14 



addq. 1 

#2,a7 



cmp. w 

#2, dO 



bne 

getrl 



move.w 

#320,picturex 

* monochrome monitor 


move. w 

#200,picturey 



bra 

getrend 


getrl: 

cmp. w 

#1, dO 



bne 

getr2 



move. w 

#320,picturex 

* medium resolution (640*200 


move.w 

#100,picturey 



bra 

getrend 


getr2: 

move.w 

#160,picturex 

* low resolution (320*200) 


move.w 

#100,picturey 


getrend: 

rts 




* Hardcopy after inp_chan call * 


scrdmp: 


move. w 
trap 
addq. 1 
jsr 
rts 


#20,-(a7) 
#14 
#2, a7 
clearbuf 


182 


Abacus Software 


ST 3D Graphics 


********************************************************************* 

* Set the limit of the window for the Cohen-Sutherland * 

* clip algorithm built into the draw-line algorithm * 

* The user can choose the limits freely, which makes the * 

* draw-line algorithm very flexible. * 

********************************************************************* 


move.w 

#0,clipxule 



move.w 

#0, clipyule 



move.w 

picturex,dl 



lsl .w 

#1, dl 

★ 

times two 

subq.w 

#1, dl 

A 

minus one equals 

move.w 

dl,clipxlri 

* 

639 for monochrom 

move.w 

picturey,dl 



lsl .w 

#1, dl 

★ 

times two minus one 

subq.w 

#1, dl 

★ 

equals 399 for monochrom 

move.w 

dl,clipylri 



rts 





. even 

* Begin variable area for Program module * 

* * 

* Data area for the rotation body * 


.bss * Space for the variables 

numro: .ds.w 1 

numpt: .ds.w 1 

worldfla: .ds.l 1 

rotxdat: .ds.l 1 

rotydat: .ds.l 1 

rotzdat: .ds.l 1 


ST 3D Graphics 


Abacus Software 


rotdatx: 

.ds. 1 

1 

rotdaty: 

.ds. 1 

1 

rotdatz: 

. ds. 1 

1 

rlnumline: 

.ds .w 

1 

rlnummark: 

.ds. w 

1 

rlnumfla: 

. ds. w 

1 

plusagle: 

. ds. w 

1 

rldatx: 

.ds. w 

1540 

rldaty: 

. ds. w 

1540 

rldatz: 

.ds. w 

1540 

rllin: 

.ds. 1 

3200 


.data 



* for every line 4-Bytes 


*********************************************************************** 

* These are the coordinates of the definition line which * 

* generates the rotation body through rotation about * 

* the Y-axis. By changing coordinates the body to be * 

* created can be changed. Of course, the number of points in * 

* rlnum pt must be adapted to the new situation. By changing * 

* rlnumro the current body can be changed as well. * 

* Storage reserved here is enough for a maximum 120 rotations * 

* of 12 points. This means that for a user-defined * 

* rotation line, the product of the number of points and * 

* number of desired rotations plus one, cannot be greater * 

* than 1500. * 

*********************************************************************** 


rlxdat: .dc.w 0,40,50,50,20,30,20,30,70,80,80,0 

rlydat: -dc.w 100,100,80,60,40,30,30,-70,-80,-90,-100,-100 

rlzdat: .dc.w 0,0,0,0,0,0,0,0,0,0,0,0 


rlnumpt: .dc.w 

rlnumro: .dc.w 


12 

8 * Number of rotations for creation 


184 


Abacus Software 


ST 3D Graphics 




* Definition of the house * 

* * 


.data 

housdatx: .dc.w 
.dc.w 

housdaty: .dc.w 
.dc.w 
.dc.w 

housdatz: .dc.w 
.dc.w 
.dc.w 

houslin: .dc.w 

.dc.w 
.dc.w 
.dc.w 


hnummark: 

.dc.w 

hnumline: 

.dc.w 

hxangle: 

.dc.w 

hyangle: 

.dc.w 

hzangle: 

.dc.w 

xwplus: 

.dc.w 

ywplus: 

.dc.w 

zwplus: 

.dc.w 

picturex: 

.dc 

picturey: 

. dc 


-30,30,30,-30,30,-30,-30,30,0,0,-10,-10,10,10 
30,30,30,30,30,30,30,30,30,30,30,30 


30,30,-30,-30,30,30,-30,-30,70,70,-30,0,0,-30 

20 , 20 , 0 , 0 , 20 , 20 , 0,0 

-10,-10,-30,-30 


60,60,60,60,-60,-60,-60,-60,60,-60,60,60,60,60 
40,10,10,40,-10,-40,-40,-10 
0 ,- 20 ,- 20,0 


1,2,2, 3,3, 4,4,1,2,5,5,8, 8,3, 8, 7,7,6, 6,5,6,1,7, 4 

9,10,1,9,9,2,5,10,6,10,11,12,12,13,13,14 

15,16,16,17,17,18,18,15,19,20,20,21,21,22,22,19 

23,24,24,25,25,26,26,23 

26 * Number of corners in the house 

32 * Number of lines in the house 

0 * Rotation angle of house about X-axis 

0 * .in « Y-axis 

0 * " " " Z-axis 

0 * Angle increment around X-axis 

0 * Angle increment around Y-axis 

0 * Angle increment around Z-axis 

0 * Definition of zero point of the screen 

0 * provided with values from subroutine getreso 


185 


ST 3D Graphics 


Abacus Software 


rotdpx: 

• dc.w 

0 

rotdpy: 

.dc.w 

0 

rotdpz: 

.dc.w 

0 


rlzl: .dc.w 0 

normz: .dc.w 1500 



.bss 



plusrot: 

.ds. 1 

1 


first: 

. ds. w 

1 


second: 

.ds. w 

1 


deltal: 

.ds . w 

1 



.data 



flag: 

.dc.b 

1 



.even 




.bss 



diffz: 

.ds. w 

1 


dx: 

.ds .w 

1 


dy: 

.ds. w 

1 


dz : 

.ds. w 

1 


worldx: 

. ds. w 

1600 

* World coordinate array 

worldy: 

.ds. w 

1600 


worldz: 

. ds. w 

1600 


viewx: 

.ds. w 

1600 

* View coordinate array 

viewy: 

.ds. w 

1600 


viewz: 

.ds. w 

1600 


screenx: 

,ds. w 

1600 

* Screen coordinate array 

screeny: 

. ds. w 

1600 



186 


Abacus Software 


ST 3D Graphics 


wlinxy: 

.ds. 1 

3200 

* 

Line array 


• data 




prox: 

. dc. w 

0 

* 

Coordinates for projection- 

proy: 

. dc. w 

0 

* 

center here on the positive 

proz: 

.dc. w 

1500 

* 

Z-axis 


.data 




of fx: 

.dc.w 

0 

★ 

Transformation for rotation 

of fy: 

. dc. w 

0 

* 

to point [offx,offy,offz] 

of f z : 

.dc.w 

0 



xoffs: 

.dc.w 

0 

* 

Inverse transformation for point 

yoffs: 

.dc.w 

0 

★ 

[xoff,yoffs, zoffs] 

zoffs: 

.dc.w 

0 





.bss 


loopc: 

.ds. 1 

.end 

1 


187 



ST 3D Graphics 


Abacus Software 


4.2.1 New subroutines in this program: 


r 1 set: Supplies the rotation body creation routine with the 

parameters of the specific rotation body, i.e. with 
the address of its definition line, with the number 
of the points forming this line and the desired 
number of rotations. 


makerotl: Creates the rotation body rotl in the array 
rldatx, rldaty, rldatz, and the lines 
(rllin) and passes the total number of points and 
lines created. 


rotstart: Creates the points of the rotation body and is called 
by makerotl as is: 

rot 1 in: Creates the lines of the rotation body. 

wrld2set: Passes the parameters of the world system and the 
rotation body to the link file variables. The 
variables for storing of the rotation angle 
hxangle remain the same, nothing in inp_chan 
needs to be changed. 

In contrast to the first program where the house was already explicitly 
provided, the object to be represented must first be created. This is the 
task of the subroutine makerotl, which generates the rotation body in 
the array rldatx, rldaty, rldatz. This array corresponds to the 
house array housdatx, housdaty, housdatz. The rotation body is 
transferred to the world system and its position parameters in the main 
loop are modified in a loop. You should experiment freely with this 
program and change the definition line for the rotation body and the 
number of rotations. The only limitation is in the maximum number of 
points and lines where the total number of lines rlnumline is calculated 
as follows: 


rlnummark: Total number of comers in the rotation body 
rlnumline: Total number of lines in the rotation body 
r lnumpt : Number of points in the definition line 


188 


Abacus Software 


ST 3D Graphics 


r lnumro: Number of desired rotations of the definition line 

rlnumline:= ((rlnumpt - 1) * (rlnumro) + 

(rlnumpt * rlnumro)) 

rlnummark:= (rlnumpt * (rlnumro + 1)) 

The number of points can not exceed 1600 and the number of lines 
cannot be greater than 3200. 

The expression (rlnumro+1) results from the programming trick, of 
rotating the definition line one time more than necessary. The definition 
line, which is the first line in the array, is created a second time at the end 
of the array. This simplifies the construction of the line array. And now 
you can try the various rotation lines such as the following: 

Definition of a Ball: 


* Definition line and parameter of the ball * 

* from Fig. 4.2.1 ************ 


rlxdat: .dc.w 
rlydat: .dc.w 
rlzdat: .dc.w 
rlnumpt: .dc.w 
rlnumro: .dc.w 
for creation 


0,40,70,90,100,90,70,40,0 
100,90,70,40,0,-40,-70,-90,-100 
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,0 
9 

60 * Number of rotations 


You need only exchange the corresponding lines in the listing for these. 
The operation parameters of the program are the same as in house 1: 


cursor left and right: 
Change the Y-rotation angle increment 


cursor up and down: 

Change the X-rotation angle increment 


undo and help: 

Change the Z-rotation angle increment 


189 








ST 3D Graphics 


Abacus Software 


+ and - on the keypad: 

Move the projection plane on the Z-axis (increase or decrease the size of 
object). 

* and / on the keypad: 

Move the rotation reference point on the Z-axis 

Shift 'D': 

Hardcopy on the printer 


190 



Abacus Software 


ST 3D Graphics 


4.3 Hidden line algorithm for convex bodies 


If you are familiar with real time 3-D graphics on other computers, you 
were probably surprised by the speed of the display of the wire frame 
drawings on the Atari ST. On the other hand some game freaks may 
remark that "I’ve seen the fastest 3-D games on my 8-bit C-64 and these 
wire models just don’t compare.” For game programming, the main 
emphasis is on the desired effect. Therefore the active figures for these 3- 
D-Games are mostly space ships and landscapes which are pre-calculated 
and their point coordinates are already stored in the computer. For the 
display which follows on the screen, the object is simply drawn, which 
naturally can be done quickly, even with 8-bit computers. A disadvantage 
of this method is the enormous storage requirement, since every possible 
position of the object must be available in memory, meaning that this 
procedure cannot be used with complex bodies. In this case only the 
rotation matrices for the rotation around three axes are calculated ahead 
of time and stored in a table. Even with this method the limits of the 

storage are reached quickly. An extreme example: If you want to 

calculate the rotation matrices of all possible values for subsequent 
rotation about three axes, with an angle increment of one degree 
previously calculated, the result will be more than 46 million possibilities 
(variations of three rotations around 360 possible angles). If this method 
is used, the degree of freedom of the objects must be limited to one or 

two possible axes, and/or the gradations of the angle values must be 

raised so that the table is calculated, for example, only in ten degree 
steps, or only rotations from zero to to ninety degrees are permitted. 
Another common method consists of defining the objects as picture 
shapes, quasi-sprites, in various positions and to switch back and forth 
between the various shapes and to move the whole shape over the 
display. Of course the last procedure is the fastest since nothing has to be 
calculated and the only operation is moving data into the screen memory. 

Now back to the Atari ST, which, because of its enormous computing 
power, can not only calculate the wire frame drawing in real time, but as 
you will see also offers the ability to display simple convex bodies in real 
time without the hidden lines. The method used corresponds to the 
surface method used in chapter 2.7. To use this method you must specify 
every surface of the object precisely. For the example of our house, we 
need two new variables. First the number of surfaces of the house 
(hnumpla=13), and second the storage space for the description of 
these surfaces (houspla). Every surface is described by the number of 


191 


ST 3D Graphics 


Abacus Software 


lines pertaining to it, followed by the lines themselves. The description: 
4,1,2,2,3,3,4,4,1 would mean: 

Four lines belong to this surface and appear as follows: 

Line #. connects Point # with Point # 

1 1 2 

2 2 3 

3 3 4 

4 4 1 

To return to the example of our house, it will be necessary to describe all 
of the surfaces of this house in the same manner. For this reason we draw 
the various views of the house and number the surfaces in any desired 
sequence as in Figures 4.3.1 to 4.3.6. In these illustrations the desired 
result is already achieved, i.e. the hidden lines are already removed to 
prevent confusion. 

Figure 4.3.1 - 4.3.6: Hardcopy of House Views 


192 


Abacus Software 


ST 3D Graphics 













ST 3D Graphics 


Abacus Software 


point. To make it possible for the algorithm to recognize the hidden 
surfaces, the sequence of the line points (the direction of the individual 
lines) is not arbitrary but must be done in the clockwise direction. This is 
the procedure: 

1. Number the surfaces. 

2. Create a surface array containing the number of lines 
(counted clockwise) of each surface as well as the lines of 
each surface, as viewed from the outside. 

3. When all surfaces have been taken care of the number of 
surfaces are stored in a variable (numpla). 

Here is the surface list for the thirteen surfaces of the house from Figure 
4.3.1. You can get the point indices from Figure 4.1.3. 

Surface # Number Lines Lines from Point # 

to Point # 


1 

4 

1, 2 

2, 3 

3/ 4 

4, 1 

2 

4 

2, 5 

5, 8 

8, 3 

3, 2 

3 

4 

5, 6 

6, 7 

7, 8 

8, 5 

4 

4 

7, 6 

6, 1 

1/ 4 

4, 7 

5 

4 

4, 3 

3, 8 

8, 7 

7, 4 

6 

4 

2, 9 

9, 10 

10, 5 

5, 2 

7 

4 

10, 9 

9, 1 

1, 6 

6,10 

8 

3 

1/ 9 

9, 2 

2, 1 


9 

3 

5, 10 

10, 6 

6, 5 


10 

4 

11, 12 

12,13 

13, 14 

14,11 

11 

4 

15,16 

16, 17 

17,18 

18,15 

12 

4 

9,20 

20,21 

21,22 

22,19 

13 

4 

23,24 

24,25 

25,26 

26,23 


Number of surfaces: 13 

With this method of surface definition you can describe up to 32,000 
lines which can be the connecting lines for 16,000 different points, 
though only if you have enough memory, of course. The actual main 
program hidel. s corresponds to the first main program house 1. s. 
Two subroutines have been added: hideit: and surfdraw: and two 


196 


Abacus Software 


ST 3D Graphics 


other changes were made in the main loop. The subroutine hide it 
determines which surfaces are visible from the projection center with the 
help of the information in the surface arrary (wplane). The information 
on the visible surfaces, which correspond to the normal surfaces in the 
structure, first the number of lines followed by individual lines, is entered 
into a second array (vplane) and the total number of visible surfaces is 
stored in the surface counter surfcnt. All visible surfaces are 
subsequently drawn on the display by the subroutine surf dr aw: 
whereby many lines are drawn twice since the subroutine surf dr aw: 
takes the lines to be drawn directly from the surface array (vplane). 
Figure 4.3.1 and the connecting lines of points 2 and 3 show a concrete 
illustration. This connecting line belongs to the visible surface 1 and the 
visible surface 2. Naturally all the lines in the surface array (vplane) 
could be sorted before drawing and double lines removed. My experience 
shows that the time saved in drawing is lost in the additional sorting and 
testing, at least for less complicated bodies. Furthermore, the surface 
information is lost by the separation of the lines, which is needed in the 
following program sections. Again to run this program you must first 
compile and link it to grlinkl.s using the batch.ttp file and 
entering: aslink grlinkl hidel 


Desk File View Options 

»' - . I" " 

0 :\ 4 



BASIC1C0 S 


S BATCH 

TTP 





BUS 




i iifl 


bib 






Inlli 

BAT 


COLOR 

BAK 


COLOR 

PRG 


COLOR 

S 


COLOR1 

BAK 


COLOR1 

0 


COLOR1 

S 

m 

w-1 

r- 

im 

□ 


-is 

□ 


E: \ 

F:\3DW0RK.DIRS ! 

B butes used 


X ASStLPRO 

HIDEl S 


X FILE-PRO 

H0USE1 PRG 


X FORTOT 

H0USE1 S 


X GEHDRAM 

MAIH1 PRG 

— laTMt ? 



OPEN APPLICATION 

Kane: BATCH 
Parameters: . 

aslink grlinkl hldelj- 


• TTP 




Cancel I 


rIKICO pro 
PIN1C0 S 
HU1 PRO 


NU1 

ILTI1 

mil 

IINT1 

IINT1 


S 

PRO 

S 

PRG 

S 


R0TRTE1 PRG 
ROTATEl S 


W a* a" a*. 

was Ol n -■! '."il'M ;irna nw rrtm 


flCCBESXMi 


197 







































ST 3D Graphics 


Abacus Software 


* hidel.s 19.1.86 Version 3.0 * 

* House with hidden-line algorithm * 

* * 


.globl 

main,xoffs,yoffs,zoffs,offx,offy,offz 

-globl 

viewx,viewy,viewz 

.globl 

wlinxy,mouse off,setrotdp,inp chan,pointrot 

.text 



main: 


jsr 

apinit 

* Announce program 

jsr 

grafhand 

* Get screen handler 

jsr 

openwork 

* Display 

jsr 

mouse off 

* Turn off mouse 

jsr 

getreso 

* what resolution ? 

jsr 

setcocli 

* Prepare clip window 

move.1 

#houspla. 

worldpla * Address of surface array 

jsr 

makewrld 

* Create world system 

jsr 

wrldset 

* Pass world parameters 

jsr 

setrotdp 

* initialize observer ref. point 

jsr 

clwork 


jsr 

pagedown 

* Display logical page 

jsr 

clwork 


jsr 

inp_chan 

* Input and change parameters 


mainlopl: 


jsr 

pointrot 

* 

rotate about observer ref. point 

jsr 

pers 

* 

Perspective transformation 

jsr 

hideit 



jsr 

surfdraw 



jsr 

pageup 

* 

Display physical page 

jsr 

inp chan 

* 

Input new parameters 

jsr 

clwork 



jsr 

pointrot 

* 

Rotate around rotation ref. point 

jsr 

pers 

* 

Transform new points 

jsr 

hideit 



jsr 

surfdraw 




198 


Abacus Software 


ST 3D Graphics 


jsr 

jsr 

jsr 

jmp 


pagedown 

inp_chan 

clwork 

mainlopl 


* Display this logical page 

* Input and change parameters 

* erase physical page 

* to main loop 


mainend: move.1 physbase,logbase 


jsr 
rt s 


pageup 


* switch to normal display page 

* back to link file, and end 






* Input and change parameters such as angle increments and 

* Z-coordinate of the projection plane 






inp_chan: 

jsr 

inkey 


cmp.b 

#'D',dO 


bne 

inpwait 


jsr 

scrdmp 

inpwait: 

swap 

dO 


cmp.b 

#$4d,dO 


bne 

inpl 


addq. w 

#1,ywplus 


bra 

inpendl 

inpl: 

cmp.b 

#$4b,dO 


bne 

inp2 


subq.w 

#1,ywplus 


bra 

inpendl 

inp2: 

cmp.b 

#$50,dO 


bne 

inp3 


addq.w 

#1,xwplus 


bra 

inpendl 

inp3: 

cmp.b 

#$48,dO 


bne 

inp3a 


subq.w 

#1,xwplus 


bra 

inpendl 


* Sense keyboard, keyboard code in 

* Make harcopy 

* Test DO for 

* Cursor-right 

* if yes, then add one to 

* Y-angle increment and continue 

* Cursor-left, if yes 

* then subtract one from 

* Y-angle increment 

* Cursor-down, if yes 

* then add one to X-angle increment 

* Cursor-up 

* subtract one 


199 


ST 3D Graphics 


Abacus Software 


inp3a: 

cmp.b 

#$61,dO 


bne 

inp3b 


subq * w 

#1,zwplus 


bra 

inpendl 

inp3b: 

cmp.b 

#$62,dO 


bne 

inp4 


addq.w 

#1,zwplus 


bra 

inpendl 

inp4: 

cmp.b 

#$4e,dO 


bne 

inp5 


sub. w 

#25,dist 


bra 

inpendl 

inp5: 

cmp.b 

#$4a,dO 


bne 

inp6 


add.w 

#25,dist 


bra 

inpendl 

inp6: 

cmp.b 

#$66,dO 


bne 

inp7 


sub. w 

#15,rotdpz 


bra 

inpendl 

inp7 : 

cmp.b 

#$65,dO 


bne 

inplO 


add.w 

#15,rotdpz 


bra 

inpendl 

inplO: 

cmp.b 

#$44,dO 


bne 

inpendl 


addq.1 

#4,a7 


bra 

mainend 

inpendl: 

move.w 

hyangle,dl 


add. w 

ywplus,dl 


cmp. w 

#360,dl 


bge 

inpend2 


cmp. w 

#-360,dl 


ble 

inpend3 


bra 

inpend4 


* Undo key 


* Help key 


* + key on keypad 

* if yes then subtract 25 from 

* location of projection plane 

* (Z-coordinate) 

* - key on keypad 

* 

* if yes then add 25 

* * key on keypad 

* if yes, subtract 15 from the 

* rotation point Z-coordinate 

* Make change 

* / key of keypad 

* Add 15 


* F10 pressed ? 

* if yes, jump to 

* program end 

* Rotation angle about Y-axis 

* add increment 

* if larger than 360, subtract 360 

* if smaller than 360 

* add 360 


200 


Abacus Software 


ST 3D Graphics 


inpend2: 

sub. w 

#360,dl 


bra 

inpend4 

inpend3: 

add.w 

#360,dl 

inpend4: 

move.w 

dl,hyangle 


move.w 

hxangle,dl 


add.w 

xwplus,dl 


cmp. w 

#360,dl 


bge 

inpend5 


cmp. w 

#-360,dl 


ble 

inpend6 


bra 

inpend7 

inpend5: 

sub. w 

#360,dl 


bra 

inpend7 

inpend6: 

add.w 

#360,dl 

inpend?: 

move.w 

dl,hxangle 


move.w 

hzangle,dl 


add.w 

zwplus,dl 


cmp. w 

#360,dl 


bge 

inpend8 


cmp. w 

#-360,dl 


ble 

inpend9 


bra 

inpendlO 

inpend8: 

sub.w 

#360,dl 


bra 

inpendlO 

inpend9: 

add.w 

#360,dl 

inpendlO 

: move.w 

dl,hzangle 


rts 


* Treat 

* rotation angle about X-axis 

* in the same manner 






* Initialize the rotation reference point to [0,0,0] and the 

* rotation angle also to 0,0,0 

************************************************** ******************** 


setrotdp: move.w 
move. w 
move.w 
move.w 


#0, dl 
dl,rotdpx 
dl,rotdpy 
dl,rotdpz 


* set the start rotation- 

* datum point 


201 



ST 3D Graphics 


Abacus Software 


move.w #0,hyangle * Start rotation angle 

move.w #0,hzangle 

move.w #0,hxangle 

rts 

************************************************************************ 

* Rotate the total world system around one point, the rotation * 

* reference point * 

************************************************************************ 


pointrot: move.w 

hxangle,xangle * rotate the world around the 

move.w 

hyangle,yangle 

move.w 

hzangle,zangle 

move.w 

rotdpx,dO 

* rotation reference point 

move.w 

rotdpy,dl 


move.w 

rotdpz,d2 


move.w 

dO,xoffs 

* add for inverse transformation 

move.w 

dl,yoffs 


move. w 

d2,zoffs 


neg. w 

dO 


neg. w 

dl 


neg. w 

d2 


move.w 

dO,offx 

* subtract for transformation 

move.w 

dl,offy 


move.w 

d2,offz 


jsr 

matinit 

* Matrix initialization 

jsr 

zrotate 

* first rotate about Z-axis 

jsr 

yrotate 

* rotate 'matrix' about Y-axis 

jsr 

xrotate 

* then about X-axis 

jsr 

rotate 

* Multiply points with matrix 

rts 




*********************************************************************** 

* Generate world system from object data. All points, lines, * 

* and surfaces are transferred to the world system * 

*********************************************************************** 


makewrld: move.1 
move. 1 
move.1 
move.1 
move.1 


#housdatx,al 
ihousdaty,a2 
#housdatz,a3 
twrldx ,&A 
#wrldy,a5 


* Generate world system by 


202 


Abacus Software 


ST 3D Graphics 


move.l #wrldz,a6 

move.w hnummark,dO 

ext.l dO 

subq.l #l,dO 

makewll: move.w (al)+, (a4) + 

move.w (a2)+, (a5)+ 

move.w {a3)+,(a6) + 

dbra dO,makewll 

move.w hnumline,dO 

ext.l dO 

subq.1 #1/dO 

move.l #houslin,al 

move.l #wlinxy,a2 

makewl2: move.l (al)+,(a2)+ 

dbra d0,makewl2 

move.l worldpla,aO 

move.l #wplane,al 

move.w hnumsurf,dO 

ext.l dO 

subq.l #l,dO 

makewl3: move.w (aO)+,dl 

move.w dl,(al)+ 

ext.l dl 

subq.l #l,dl 

makewl4: move.l (a0)+, (al) + 

dbra dl,makewl4 

dbra d0,makewl3 

rts 


* Copying point coordinates 

* to world system 

* Number of house lines 


* Copy all lines into 

* world system 


* Number of surfaces on house 


* Copy all surface 

* definitions into the 

* world system 

* Copy every line of this 

* surface into the world array 

* until all surfaces are processed 


* Passing the world parameters to the link file variables 


wrldset: move.l #wrldx,datx * Pass variables for 

move.l #wrldy,daty * the rotation routine 

move.l #wrldz,datz 

move.l ^viewx,pointx 


203 





ST 3D Graphics 


Abacus Software 


move.1 

#viewy,pointy 

move.1 

#viewz,pointz 

move.1 

#wlinxy,linxy 

move.w 

picturex,xO 

move.w 

picturey,yO 

move.w 

proz,zobs 

move.w 

rlz1,dist 

move.1 

tscreenx,xplot 

move.1 

tscreeny,yplot 

move. w 

hnumline,numline 

move.w 

hnummark,nummark 

move.w 

rts 

hnumsurf,numsurf 


* remove all characters from the keyboard buffer * 


clearbuf: 


clearnd: 


move.w 

#$b,-(a7) 

trap 

#1 

addq.1 

#2, a? 

tst. w 

dO 

beq 

clearnd 

move. w 

#1,-(a7) 

trap 

#1 

addq.1 

#2, a7 

bra 

clearbuf 

rts 



********************************************************************* 

* Sense display resolution and set coordinate origin of screen * 

* to screen center * 

********************************************************************* 


move.w 

#4,-<a7) 

* Sense screen resolution 

trap 

#14 


addq.1 

#2,a7 


cmp. w 

#2, dO 


bne 

getrl 


move.w 

#320,picturex 

* Monochrome monitor 


204 



Abacus Software 


ST 3D Graphics 


move.w #200,picturey 

bra getrend 

getrl: cmp.w #l,d0 

bne getr2 

move.w #320,picturex * medium resolution (640*200) 

move.w #100,picturey 

bra getrend 

getr2: move.w #160,picturex * low resolution (320*200) 

move.w #100,picturey 

getrend: rts 

*********************************************************************** 
* Hardcopy routine, called by inp_chan 
*********************************************************************** 


scrdmp: move.w 

trap 
addq.1 
jsr 
rts 


#20,-(a7) 
#14 
#2.a7 
clearbuf 


********************************************************************* 

* Sets the limits of the display window for the Cohen-Sutherland 

* clip algorithm built into the draw-line algorithm. 

* The limits can be freely selected by the user, which makes the 

* draw-line algorithm very flexible. 

**************** 


move . w 

#0,clipxule 



move.w 

#0,clipyule 



move.w 

picturex,dl 



lsl. w 

#l,dl 

* 

times two 

subq.w 

#l,dl 

* 

minus one equal 

move.w 

dl,clipxlri 

* 

639 for monochrome 

move.w 

picturey,dl 



lsl. w 

#1, dl 

* 

times two minus one equal 

subq.w 

#1, dl 

* 

399 for monochrome 

move.w 

dl,clipylri 



rts 





205 








ST 3D Graphics 


Abacus Software 


*********************************************************************** 

* Recognition of hidden surfaces and entry of these into the * 

* vplane array, the surface information is in the surface array * 

* wplane, as well as in view system, viewx, viewy, viewz, * 

* also the total number of surfaces must be passed in numsurf * 

*********************************************************************** 


hideit: 


visible: 


move.w 

numsurf,dO 

i 

' Number of surfaces as counter 

ext .1 

dO 



subq.1 

#1, dO 



move.1 

#viewx,al 

* 

Store point coordinates here 

move.1 

#viewy,a2 



move.1 

#viewz,a3 



move.1 

Iwplane,aO 

* 

Information for every surface 

move.1 

#vplane,a5 

* 

here. 

move.w 

#0, surfcount 

* counts the known visible surfaces. 

move.w 

(aO),dl 

* 

start with first surface, number 

ext. 1 

dl 

* 

of points of this surface in Dl. 

move.w 

2(aO),d2 

* 

Offset of first point of this surf. 

move.w 

4(aO),d3 

* 

Offset of second point 

move.w 

8(aO),d4 

* 

Offset of third point 

subq.w 

#1, d2 

* 

for access to point arrays subtract 

subq.w 

#1, d3 

* 

one from current point offset 

subq.w 

#1, d4 

* 

multiply by two 

lsl. w 

#l,d2 



lsl. w 

#1, d3 



lsl. w 

#l,d4 

* 

and finally access current point 

move.w 

(al,d3.w),d6 

* 

coordinates 

cmp. w 

(al, d4 . w) , d6 

* 

comparison recognizes two points 

bne 

doitl 

* 

with same coordinates which can 

move.w 

(a2,d3.w),d6 

* 

result during construction of 

cmp. w 

(a2,d4.w),d6 

* 

rotation bodies. During recognition 

bne 

doitl 

* 

of two points in which all point 

move.w 

<a3,d4.w),d6 

* 

coordinates match (x,y,z) the 

cmp.w 

(a3, d3 . w) , d6 

* 

program selects a third point for 

bne 

doitl 

* 

determination of the two vectors 

move.w 

12(aO),d4 



subq.w 

#l,d4 



lsl. w 

#1, d4 




206 


Abacus Software 


ST 3D Graphics 


doit1: 


move.w 

(al,d3.w),d5 

move.w 

d5, kx 

sub. w 

(al,d2.w),d5 

move.w 

d5,px 

move.w 

(a2,d3.w),d5 

move.w 

d5,ky 

sub. w 

(a2,d2.w),d5 

move.w 

d5,py 

move.w 

(a3, d3 . w) , d5 

move.w 

d5, kz 

sub. w 

(a3,d2.w), d5 

move.w 

d5, pz 

move.w 

(al, d4.w),d5 

sub. w 

(al, d2.w),d5 

move.w 

(a2, d4.w),d6 

sub. w 

(a2,d2.w) ,d6 

move.w 

(a3,d4.w),d7 

sub.w 

(a3,d2.w),d7 

move.w 

d5,dl 

move. w 

d6,d2 

move.w 

d7,d3 

nulls 

py,d3 

mu Is 

pz,d2 

sub.w 

d2,d3 

move.w 

d3, rx 

mu Is 

pz,dl 

mu Is 

px,d7 

sub. w 

d7,dl 

move.w 

dl, ry 

mu Is 

px, d6 

mu Is 

py,d5 

sub. w 

d5,d6 

move.w 

d6, rz 

move.w 

prox,dl 

sub.w 

kx,dl 

move. w 

proy,d2 

sub.w 

ky,d2 

move.w 

proz,d3 


* Here the two vectors, which lie 

* in the surface plane, are 

* determined by subtracting the 

* coordinates of two points 

* from this surface. 

* The direction coordinates of the 

* vectors are stored in the 

* variables qx,qy,qz and px,py,pz 


* Calculate vector Q 


* qx 

* qy 

* qz 

* Calculate the cross product 

* of the vertical vector for the 

* current surface. 


* The direction coordinates of the 

* vertical vector are stored 

* zobsorarily in rx,ry,rz 


* The projection center 

* is used as the comparison 

* point for the visibility 

* of a surface. 

* One can also use the 


207 









ST 3D Graphics 


Abacus Software 


sub. w 

kz, d3 

* 

mu Is 

rx, dl 

* 

mu Is 

ry, d2 

* 

mu Is 

rz, d3 

* 

add. 1 

dl, d2 

* 

add. 1 

d2,d3 

* 

bmi 

dosight 

* 


* If the scalar product is negative. 



move.w 

(aO),dl 

* 


ext. 1 

dl 



lsl.l 

#2, dl 

* 


addq.1 

#2, dl 

* 


add. 1 

dl, aO 

* 

sightl: 

dbra 

dO,visible 

* 


bra 

hideend 

* 

dosight: 

move. w 

(aO),dl 

* 


ext. 1 

dl 

* 


lsl.l 

#1, dl 

* 

sight3: 

move. w 

(aO)+,(a5)+ 

* 


dbra 

dl,sight3 

* 


addq. w 

#1, surfcount 

* 


bra 

sightl 

* 

hideend: 

rts 




observation ref. point 
as the comparison point. Now comes 
the comparison of vector R with 
the vector from a point on the 
surface to the projection center 
for creating the scalar product 
of the two vectors. 

the surface is visible 

Number of lines of the surface 

Number of lines times 4 = space for 
lines plus 2 bytes for the number of 

lines added to surface array, for 
access to next surface. When all 
surfaces completed then end. 

Number of lines for this surface, 
gives the number of words to be 
transmitted when multiplied by 2. 

pass the number of lines and the 
the individual lines 

the number of surfaces plus one 
and process the next 


* Draw visible surfaces passed in vplane * 


surfdraw: 

move.l xplot,a4 

move.l yplot,a5 


* Draws a number of surfaces (passed 

* in surfcount) whose description 


move.1 
move.w 


#vplane,a6 
surfcount,dO 


* is in the array at address 

* vplane, and was entered by routine 


208 


Abacus Software 


ST 3D Graphics 



ext. 1 

dO 

* hideit 


subq.1 

#1, dO 

* if no surface is entered in the 


bmi 

surfend 

* array, then end. 

surflopl: 

move. w 

(a6)+,dl 

* Number of lines in this surface as 


ext. 1 

dl 

* counter of lines to be drawn. 


subq. 1 

#1, dl 


surflop2: 

move. 1 

(a6) +,d5 

* First line of this surface 


subq.w 

#1, d5 

* Access screen array which contains 


lsl. w 

#1, d5 

* screen coordinates of the points. 


move . w 

0(a4,d5.w),d2 



move. w 

0(a5,d5.w),d3 

* extract points from routine and 


swap 

d5 

* pass. 


subq.w 

#1, d5 



lsl .w 

#1, d5 



move.w 

0 (a4,d5 .w) , a2 

* second point of line 


move.w 

0(a5,d5.w),a3 



jsr 

drawl 

* Draw line until all lines of this 


dbra 

dl,surflop2 

* surface have been drawn and repeat 


dbra 

dO,surflopl 

* until all surfaces are drawn. 

surfend: 

rts 


* Return. 


* Here begins the variable area of the program module * 

* * 

* * 

* Definition of the house * 

* * 


.data 

housdatx: .dc.w 
• do. w 


-30,30,30,-30,30,-30,-30,30,0,0,-10,-10,10,10 
30,30,30,30,30,30,30,30,30,30,30,30 


209 





ST 3D Graphics 


Abacus Software 


housdaty: 

.dc, 

, w 

30, 

30,-30,-30,30,30, 

-30, 

-30, 

70, 

70,- 

30, 

o 

to 

1 

o 

o 


. dc, 

. w 

20, 

20, 0,0,20,20,0,0 








. dc. 

. w 

-10 

,-10,-30,-30 







housdatz: 

• dc. 

, w 

60, 

60,60,60,-60,-60, 

-60, 

-60, 

60, 

-60, 

60, 

60, 60, 60 


.dc, 

. w 

40, 

10,10,40,-10,-40, 

-40, 

-10 






. dc. 

. w 

o,- 

20,-20,0 







houslin: 

. dc. 

. w 

1, 2 

,2,3,3,4,4,1,2,5, 

5,8, 

8,3, 

8, 7 

,7, 6 

, 6, 

5, 6, 1,7,4 


. dc. 

, w 

9, 10,1, 9, 9,2,5,10, 6, 

10,11,12 

, 12 

,13, 

13, 

14 


. dc, 

. w 

15, 

16,16,17,17,18,18 

,15, 

19,20,20,21 

,21 

,22,22,19 


. dc. 

. w 

23, 

24,24,25,25,26,26 

,23 







* here are the definitions of the surfaces belonging to the house * 


houspla: .dc.w 

.dc. w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
• dc.w 


hnummark: 

.dc.w 

hnumline: 

.dc.w 

hnumsurf: 

.dc.w 

hxangle: 

.dc.w 

hyangle: 

.dc.w 

hzangle: 

.dc.w 

xwplus: 

.dc.w 

ywplus: 

.dc.w 

zwplus: 

.dc.w 

picturex: 

.dc.w 

picturey: 

.dc.w 


4,1,2,2,3,3,4,4,1,4,2,5,5,8,8,3,3,2 

4,5,6, 6, 7, 7,8, 8,5, 4,7,6, 6,1,1, 4,4,7 

4,4,3,3,8, 8,7, 7,4,4,2,9, 9,10, 10,5, 5,2 

4,10,9,9,1,1,6,6,10,3,1,9,9,2,2,1 

3,5,10,10,6,6,5,4,11,12,12,13,13,14,14,11 

4,15, 16, 16, 17, 17, 18, 18, 15,4, 19, 20,20, 21,21, 22, 22, 19 

4,23,24,24,25,25/26,26,23 


26 * Number of corner points of the house 

32 * Number of lines of the house 

13 * Number of surfaces of the house 

0 * Rotation angle of house about X-axis 

0 * " " Y-axis 

0 * " " Z-axis 

0 * Angle increment about X-axis 

0 * Angle increment about Y-axis 

0 * Angle increment about Z-axis 

0 * Definition of zero point of display 

0 * entered by getreso 


210 


Abacus Software 


ST 3D Graphics 


rotdpx: 

• dc. w 

0 


rotdpy: 

. dc. w 

0 


rotdpz: 

.dc. w 

0 


rlzl: 

. dc. w 

0 


normz: 

.dc. w 

1500 



.bss 



plusrot: 

. ds. 1 

1 


first: 

.ds.w 

1 


second: 

.ds. w 

1 


deltal: 

.ds.w 

1 


worldpla: 

.ds. 1 

1 

* Address of surface array 


.data 



plag: 

.dc .b 

1 



.even 




.bss 



diffz: 

.ds.w 

1 


dx: 

.ds.w 

1 


dy: 

.ds.w 

1 


dz: 

.ds.w 

1 


wrldx: 

.ds.w 

1600 

* World coordinate array 

wrldy: 

.ds.w 

1600 


wrldz : 

.ds.w 

1600 


viewx: 

.ds.w 

1600 

* View coordinate array 

viewy: 

.ds.w 

1600 


viewz: 

.ds.w 

1600 


screenx: 

.ds.w 

1600 

* Display coordinate array 

screeny: 

.ds.w 

1600 



211 






ST 3D Graphics 


Abacus Software 


wlinxy: 

• ds. 1 

3200 

* Line array 

wplane: 

.ds. 1 

6600 

* Surface array 

vplane: 

.ds. 1 

6600 

* Surface array of visible surfaces 

surfcount: 

• ds. w 

1 


numsurf: 

• ds. w 

1 


zcount: 

. ds. 1 

1 

* Sum of all Z-coordinates 

zpla: 

. ds. w 

1 

* Individual Z-coordinates of surface 

sx: 

. ds. w 

1 


sy: 

.ds .w 

1 


sz: 

.ds .w 

1 


px: 

.ds. w 

1 


py: 

• ds. w 

1 


pz: 

• ds. w 

1 


rx: 

.ds. w 

1 


ry: 

.ds. w 

1 


rz: 

. ds. w 

1 


qx: 

.ds .w 

1 


qy: 

-ds. w 

1 


qz: 

.ds. w 

1 


kx: 

-ds. w 

1 


ky: 

.ds. w 

1 


kz: 

.ds. w 

1 



. data 



prox: 

.dc.w 

0 

* Coordinates of the projection center 

proy: 

. dc. w 

0 

* on the positive Z-axis 

proz: 

.dc.w 

1500 



212 



Abacus Software 


ST 3D Graphics 



.data 




of fx: 

. dc. w 

0 

* 

Transformation during rotation 

of fy: 

.dc. w 

0 

* 

to point [offx,offy,offz] 

of f z: 

. dc. w 

0 



xoffs: 

.dc. w 

0 

* 

Inverse transformation to point 

yoffs: 

. dc. w 

0 

★ 

[xoff,yoffs, zoffs] 

zoffs: 

.dc. w 

0 





.bss 


loopc 

.ds. 1 

. end 

1 


213 








ST 3D Graphics 


Abacus Software 


4.3.1 Explanation of the newly-added subroutines 


hideit: In contrast to the explanation in the mathematical part, the 

view system used by the program is a right system; this 
saves the multiplication of the Z-values by -1. The 
subroutine hideit forms two vectors within the surface 
from the first three points of every surface. These are the 
vectors from point one to point two as well as the vector 
from point one to point three. These two vectors 
correspond to the vectors P[px,py,pz] and 
Q[qx,qy,qz] from chapter 2.7. Furthermore, a third 
vector R[rx,ry,rz] is generated through the formation 
of the cross product of the vectors P and Q. According to 
the definition, the cross product is perpendicular to the 
vectors P and Q and, in this sequence forms a right-hand 
system with them [p, q, r]. Finally, a vector is created 
from a point on the surface to the projection center 
(S[sx,sy,sz]), and its direction is compared with the 
direction of the vector R by creation of the scalar products 
of the vectors S and R. All the surfaces which are in front 
of the projection center are visible. 

Scalar product= sx*rx+sy*ry+sz*rz = 

!s|*|r|*cos(Alpha) 

Alpha is the angle suspended between the vectors R and S. 
If the result of the scalar product is negative, this means an 
angle larger than 90 degrees and smaller than 270 degrees 
between the two vectors, which point in different 
directions (See also Figure 2.7.1), and so this surface is 
visible, according to the surface definition (clockwise 
direction) and right system used. 

surf dr aw: Here the visible surfaces are displayed by drawing the 
lines of the array vplane. The whole job was done 
already by hideit. 

The operation parameters of the program are the same as in house 1. s, 
The rotation point on the Z-axis can be moved with the * and / keys on 
the keypad, the projection plane can be moved with the - and + keys on 
the keypad, and the angle increments of the rotation angle around the X 


214 


Abacus Software 


ST 3D Graphics 


and Y-axis can be changed with the cursor keys and the Help and Undo 
keys. Of course you can also change all the parameters within the 
program (projection center, rotation reference point to X and Y-axis, 
etc.). 


4.3.1.1 Errors with non-con vex bodies 


If the rotation creation routine is added to the main program and the chess 
figure is created with hideit: and pladraw without hidden lines: you 
can see the problem. With concave bodies such as this chess figure there 
is the possibility that one of the surfaces recognized by the hideit: 
algorithm as visible can be hidden by another visible surface during 
viewing. In this case the hideit: algorithm fails and the problem must 
be solved with another algorithm. 



215 







ST 3D Graphics 


Abacus Software 


4.4 The painter algorithm 


Recall the problem we‘re trying to solve: Surfaces which are seen from 
an observation point have their surface normal vector pointed in another 
direction from a vector from any point on the surface to the projection 
center, are hidden by other surfaces which according to this criterium are 
also visible. If you start from the observation point (projection center) on 
the positive Z-axis, the middle Z-coordinate of a surface is a possible 
description of it and its position in the world system. The middle Z- 
coordinate is obtained by defining the arithmetic center of the comer 
point coordinates belonging to the surface, i.e. summation of all surface 
comer point Z-coordinates and division by the number of comer points 
belonging to the surface. The relationship can be made clear with the 
simple example with three different surfaces in Figure 4.4.1. 



216 




Abacus Software 


ST 3D Graphics 


Viewing the defined world system from one point on the positive Z axis, 
we can say: the surface with the largest middle Z-coordinate is visible in 
its entire size and is not hidden by any other surface. Note that all 
observed surfaces are on the negative Z-axis (-200 > -400). This 
completely visible surface covers parts of surfaces with a smaller middle 
Z coordinate. Surfaces 2 and 3 are covered by surface 1 and surface 3 is 
again covered by surface 2. The surfaces are sorted by their Z-coordinates 
and they are drawn starting with the smallest middle z-coordinate, surface 
3, and then the surfaces with the larger Z coordinates, and we have found 
a possible solution to the problem by covering hidden surfaces with other 
surfaces. You must consider that it is not enough just to draw every 
surface. The individual surfaces must be filled with "color" or a pattern so 
that the surfaces drawn first are really covered. Figure 4.4.2 shows one 
possible result 


+ Y 



Figure 4.4.2 


If we think about our rotation body from chapter 4.2, this means first of 
all that when the rotation body is created its surfaces must also be 


217 





ST 3D Graphics 


Abacus Software 


created, second a middle Z coordinate must be calculated and stored 
some place for every surface. Another problem is sorting the surfaces. If 
one wanted to sort every defined form with its lines, it would require an 
enormous movement of data in storage. To avoid this, a new storage area 
is created in which the Z-coordinates together with the beginning address 
of the surface it pertains to are stored. The individual surfaces are stored 
in a simple linear list. The beginning address of every surface is the 
storage address at which the number of lines for this surface is stored. 
Through storage of this address, it is possible to access every single 
surface directly, which previously was not possible because of the 
number of lines belonging to each surface. 

To better handle the two pieces of information, (Z-coordinates of the 
surface and address of the surface) we select a long word as data size for 
both, i.e. in the newly constructed array (surfaddr) there are four 
successive bytes for the Z-coordinate and four bytes for the address of the 
surface. Each description of a surface "occupies" eight bytes of storage 
space. This array contains the visible surfaces represented by their middle 
Z-coordinates and their beginning addresses in the new addition to the 
subroutine hide it: (sight 2). In this special case of the rotation body 
whose surfaces all consist of four lines, the division by the line number 
(4) for calculation of the middle Z-coordinate can be performed by 
shifting right by two bit positions. If you want to include surfaces with 
more or less than four lines in the paint routine, you must alter the 
hide it -routine and divide by the number of surfaces. After the 
adaptation of the subroutine hideit: all visible surfaces are in the two 
arrays, in vplane: and in surfaddr:. The number of surfaces, like in 
the first version of hideit:, goes in the variable placount:. 
Fortunately, we do not have to write the shading function since the 
operating system offers a function for filling display areas with a shading 
pattern (Filled Area). This function fills a polygon whose points are 
passed in the ptsin array, with one of a total of 36 different predefined, 
and one user-defined shading pattern. Before calling this function with 
the opcode 9, we set up the different shading parameters which is done 
using the subroutines filmode, filform, filcolor, filstyle 
and f ilindex which are contained in the link file (grlink 1). 

The shading routine is called by the subroutine paint it, which first 
sorts all surfaces contained in surfaddr: according to ascending Z- 
coordinates. Next you must pass the individual surfaces, i.e. their end 
point coordinates, to the function "Filled Area". This begins with the 
surface which has the smallest middle Z-coordinate. The function "Filled 


218 


Abacus Software 


ST 3D Graphics 


Area" can, in connection with the function "Set Clipping Rectangle", 
Opcode 129, fill surfaces limited to a display window. It is necessary to 
call the function "Set Clipping Rectangle" when the display window is 
the total screen area, bordered by the coordinates 0,0 and 639,399 (for 
BW monitors), if this is not done, "Filled Area" may draw parts of the 
polygon sticking beyond the display frame on the neighboring display 
page (wrapping). You could fill all surfaces with the same pattern, which 
could also be white. You can assign a shading pattern for every surface 
corresponding to its Z-coordinates. We will limit ourselves to only six of 
the 36 possible fill patterns. This is done purely for optical reasons since 
shaded surfaces, and even completely filled color surfaces, can have a 
negative effect on the picture. You can influence this choice or omit it 
entirely. Simply set the desired pattern on entry to the subroutine. With a 
color monitor, a various fill colors can be used instead of a shading 
pattern. The choice of colors is completely up to you. The visual effect of 
these three-dimensional graphics can best be appreciated with a high- 
resolution monitor. Doubling the resolution in both directions increases 
the quality of the picture four times. 

If you have a color monitor, you can choose between filling with color or 
patterns. If you want to try filling with color you must call the function 
filstyle with the value one in the DO register when entering the 
paint it routine. The subroutine filcolor: makes it possible to use 
different colors. Owners of monochrome monitors don’t have to change 
anything in the program. To run this program call the batch file batch.ttp 
then enter: as link grlinkl paintl 



253882 bytes used 1 


Si PRINTERS 
Si TUTORIAL 
C FRY 

COM TTP 
NLlfl PRG 
OUTPUT PRG 
SPLIT TTP 
STRNDARD PRT 
TEXTPRO PRG 
TUTORIAL TXT 
XTTUTORI TOC 


1442236 bytes used in 125 itens 


38944 




OPEN APPLICATION 

Mane: BATCH .TTP 
Paraneters: 

aslink grlinkl paintlj—_ 


1 


F:\3DM0RK.DIR\ 


333956 butes used in 


H0USE1 PRG 
H0USE1 S 
HAIN1 PRG 
HRIN1 S 
MAIK1C0 PR6 
MAIN1C0 S 
HENU1 PRG 

MENU1 S 

MULTI1 PRG 
MULTI1 S 
PAINT1 PRG 
PAINT1 S 
R0TATE1 PRG 
R0TATE1 S 































ST 3D Graphics 


Abacus Software 



Figure 4.4.3 


Here is the listing of the fourth main program for the link file 
grlinkl.s. It is called paintl.s. The operating parameters again 
correspond to the previous program. 


220 






Abacus Software 


ST 3D Graphics 


********************************************************************** 

* paint 1.s 9.2.1986 * 

* Display a shaded rotation body * 

* * 
★********************************************************************* 

.text 

.globl main,xoffs,yoffs, zoffs,offx,offy,offz 

.globl viewx,viewy,viewz 

.globl wlinxy,mouse_off,setrotdp,inp_chan,pointrot 


main: 


jsr 

apinit 

* 

Announce program 

jsr 

grafhand 

* 

Get screen handler 

jsr 

openwork 

* 

open workstation 

jsr 

mouseoff 

* 

Turn off mouse 

jsr 

getreso 

* 

Display resolution ? 

jsr 

setcocli 

* 

Set clip window 

jsr 

makerotl 

* 

Create rotation body 


jsr 

makewrld 

* 

Create world system 

jsr 

wrld2set 

★ 

Pass world parameters 

jsr 

setrotdp 

★ 

initialize observation ref. point 

jsr 

clwork 



jsr 

pagedown 

* 

Display logical page 

jsr 

clwork 



jsr 

inp chan 




mainlopl: 


jsr 

pointrot 

* 

rotate around observ. ref. point 

jsr 

pers 

* 

Perspective transformation 

jsr 

hideit 

★ 

hide hidden surfaces 

jsr 

paintit 

★ 

sort and shade 

jsr 

pageup 

* 

Display physical page 

jsr 

inp chan 

* 

Input new parameters 

jsr 

clwork 

★ 

clear screen page not displayed 

jsr 

pointrot 

* 

Rotate around rot. ref. point 

jsr 

pers 

★ 

Transform new points 

jsr 

hideit 

* 

hide 

jsr 

paint it 

* 

sort and shade 


221 





ST 3D Graphics 


Abacus Software 


jsr 

pagedown * 

Display this logical page 

jsr 

inp chan * 

Input and change parameters 

jsr 

clwork * 

erase physical page 

jmp 

mainlopl * 

to main loop 

move. 1 

physbase,logbase 

jsr 

pageup * 

Switch to normal screen page 

rts 

★ 

back to link file and end 


A********************************************************************** 

* Creation of rotation body by passing parameters * 

* and calling rotation routine * 

it********************************************************************** 


makerotl: jsr 
jsr 
rts 


rlset * Set parameters of rot. body 

rotstart * and create rot. body 


* Input and change parameters with the keyboard * 


inp__chan: 

jsr 

inkey 


cmp .b 

#'D',dO 


bne 

inpwait 


jsr 

scrdmp 

inpwait: 

swap 

dO 


cmp .b 

#$4d,dO 


bne 

inpl 


addq. w 

#1,ywplus 


bra 

inpendl 

inpl: 

cmp .b 

#$4b,dO 


bne 

inp2 


subq. w 

#1,ywplus 


bra 

inpendl 


* Read keyboard, code in 

* Make hardcopy 

* Test DO for 

* Cursor-right 

* if yes, add one to 

* Y-angle increment and continue 

* Cursor-left, if yes 

* subtract one from 

* Y-angle increment 


222 



Abacus Software 


ST 3D Graphics 


inp2 : 

cmp .b 

#$50,dO 


bne 

inp3 


addq. w 

#1, xwplus 


bra 

inpendl 

inp3: 

cmp .b 

#$48,dO 


bne 

inp3a 


subq.w 

#1,xwplus 


bra 

inpendl 

inp3a: 

cmp .b 

#$61,dO 


bne 

inp3b 


subq.w 

#1,zwplus 


bra 

inpendl 

inp3b: 

cmp -b 

#$62,dO 


bne 

inp4 


addq.w 

#1,zwplus 


bra 

inpendl 

inp4 : 

cmp.b 

#$4e,dO 


bne 

inp5 


sub. w 

#25,dist 


bra 

inpendl 

inp5: 

cmp.b 

#$4a,dO 


bne 

inp6 


add. w 

#25,dist 


bra 

inpendl 

inp6: 

cmp.b 

#$66,dO 


bne 

inp7 


sub. w 

#15,rotdpz 


bra 

inpendl 

inp7 : 

cmp.b 

#$65,dO 


bne 

inplO 


add. w 

#15,rotdpz 


bra 

inpendl 


* Cursor-down, if yes 

* add one to X-angle 

* increment 

* Cursor-up 

* subtract one 

* Undo key 

* decrease Z-increment 

* Help key 

* increase Z-increment 

* + key on keypad 

* if yes, subtract 25 from 

* location of projection 

* plane (Z-coordinate) 

* minus key on keypad 

* 

* if yes, add 25 

* * key on keypad 

* if yes, subtract 15 from 

* rotation point Z-coordinate 

* Make change 

* / key on keypad 

* add 15 


223 






ST 3D Graphics 


Abacus Software 


inplO: 

cmp .b 

#$44,dO 

* 

F10 pressed ? 


bne 

inpendl 




addq. 1 

#4,a7 

* 

if yes, then jump to 


bra 

ma inend 

* 

program end 

inpendl: 

move. w 

hyangle, dl 

* 

Rotat.angle about Y-axis 


add. w 

ywplus,dl 

★ 

add increment 


cmp. w 

#360,dl 

* 

if larger than 360, then 


bge 

inpend2 

* 

subtract 360 


cmp. w 

#-360,dl 

* 

if smaller than 360, then 


ble 

inpend3 

* 

add 360 


bra 

inpend4 



inpend2: 

sub. w 

#360,dl 




bra 

inpend4 



inpend3: 

add. w 

#360,dl 



inpend4: 

move. w 

dl,hyangle 




move. w 

hxangle,dl 

* 

do the same for 


add. w 

xwplus,dl 

★ 

the rotation angle 


cmp. w 

#360,dl 

★ 

about X-axis 


bge 

inpend5 




cmp. w 

#-360,dl 




ble 

inpend6 




bra 

inpend7 



inpend5: 

sub. w 

#360,dl 




bra 

inpend7 



inpend6: 

add. w 

#360,dl 



inpend7: 

move.w 

dl,hxangle 


* 


move.w 

hzangle,dl 




add. w 

zwplus,dl 




cmp.w 

#360,dl 




bge 

inpend8 




cmp. w 

#-360,dl 




ble 

inpend9 




bra 

inpendlO 



inpend8: 

sub. w 

#360,dl 




bra 

inpendlO 



inpend9: 

add. w 

#360,dl 




224 


Abacus Software 


ST 3D Graphics 


inpendlO: move.w dl,hzangle 
rts 

* Initialize the rotation reference point to [0,0,0] * 


move.w 

#0, dl 

* set the Initial rotation 

move.w 

dl,rotdpx 

* ref. point 

move. w 

dl,rotdpy 


move.w 

dl,rotdpz 


move. w 

#0,hyangle 

* initial rotation angle 

move.w 

#0,hzangle 


move.w 

#0,hxangle 


rts 




* Rotation around the rotation reference point about all * 

* three axes * 


pointrot: move.w 

hxangle,xan 

gle 

* rotate the world around 

move.w 

hyangle,yangle 


move.w 

hzangle,zangle 


move.w 

rotdpx,dO 


* rotation reference point 

move.w 

rotdpy,dl 



move. w 

rotdpz,d2 



move.w 

dO,xoffs 

* 

add for inverse transform 

move.w 

dl,yoffs 



move. w 

d2,zoffs 



neg. w 

dO 



neg. w 

dl 



neg. w 

d2 



move.w 

dO,of fx 

* 

subtract for transform 

move.w 

dl,offy 



move.w 

d2,offz 



jsr 

matinit 

* 

initialize matrix 

jsr 

zrotate 

■k 

rotate first about Z-axis 

jsr 

yrotate 

* 

rotate 'matrix' about Y-axis 

jsr 

xrotate 

* 

then rotate about X-axis 

jsr 

rotate 

* 

Multiply points with matrix. 

rts 





225 







ST 3D Graphics 


Abacus Software 


*********************************************************************** 

* Create world system by copying the object data into world system * 
*********************************************************************** 


makewrld: 


makewll: 


makewl2: 


makew!3: 


makewl4: 


move. 1 

#rldatx,al 

* Create world system by 

move.1 

#rldaty,a2 


move.1 

trldatz,a3 


move.1 

#wrldx,a4 


move. 1 

#wrldy,a5 


move.1 

#wrldz,a6 


move.w 

rlnummark,dO 


ext. 1 

dO 


subq.1 

#l,dO 


move.w 

(al)+, <a4)+ 

* copying point coordinates 

move.w 

(a2)+, (a5) + 

* into the world system 

move.w 

(a3)+, <a6)+ 


dbra 

dO,makewll 


move.w 

rlnumline,dO 


ext. 1 

dO 


subq.1 

#l f dO 


move.1 

#rllin,al 


move.1 

#wlinxy,a2 


move.1 

(al)+, (a2) + 

* Copy lines into world 

dbra 

d0,makewl2 

* system 

move.1 

worldpla,aO 


move.1 

#wplane,al 


move.w 

rlnumsurf,dO 


ext. 1 

dO 


subq.1 

#1, dO 


move.w 

(aO)+,dl 

* Copy surfaces into 

move.w 

dl, (al) + 

* world system 

ext. 1 

dl 


subq.1 

#1 / dl 


move.1 

(aO)+,(al)+ 

* Copy every line of 

dbra 

dl,makewl4 

* this surface into 

dbra 

dO,makewl3 

* world array until all 

rts 


* surfaces are completed 


226 


Abacus Software 


ST 3D Graphics 


********************************************************************* 

* Pass the world parameters to the variables in the * 

* link files 

********************************************************************* 


wrldset: 


move.1 

#wrldx,datx * 

move. 1 

#wrldy,daty * 

move.1 

#wrldz,datz * 

move.1 

#viewx,pointx 

move.1 

#viewy,pointy 

move.1 

#viewz,pointz 

move.1 

#wlinxy,linxy 

move. w 

picturex,xO 

move.w 

picturey,yO 

move.w 

proz,zobs 

move.w 

rlzl,dist 

move.1 

Iscreenx,xplot 

move.1 

#screeny,yplot 

move.w 

hnumline,numline 

move.w 

hnummark,nummark 

move.w 

rts 

hnumsurf,numsurf 


Pass the variables 
for the rotation 
routine 


* Remove all characters from keyboard buffer 


clearbuf: 

move. w 

#$b,-(a7) 


trap 

#1 


addq. 1 

#2, a7 


tst. w 

dO 


beq 

clearnd 


move.w 

#1,-{a7) 


trap 

#1 


addq.1 

#2, a7 


bra 

clearbuf 

clearnd: 

rts 



227 









ST 3D Graphics 


Abacus Software 


********************************************************************* 

* Sense display resolution and set coordinate * 

* origin to screen center * 

********************************************************************* 


getreso: 

move.w 

#4,-(a7) 

* 

Sense display resolution 


trap 

#14 




addq.1 

#2,a7 




cmp. w 

#2, dO 




bne 

getrl 




move.w 

#320,picturex 

★ 

Monochrome monitor 


move.w 

#200,picturey 




bra 

getrend 



getrl: 

cmp • w 

#1, dO 




bne 

getr2 




move.w 

#320,picturex 

* 

medium resolution (640*200 


move.w 

#100,picturey 




bra 

getrend 



getr2: 

move.w 

#160,picturex 

* 

low resolution (320*200) 


move.w 

#100,picturey 



getrend: 

rts 





* Hardcopy of screen, called by inp_chan * 

* * 


scrdmp: 


move. w 
trap 
addq. 1 
jsr 
rts 


#20,-(a7) 
#14 
#2,a7 
clearbuf 


228 









Abacus Software 


ST 3D Graphics 


********************************************************************* 

* Sets the limits of the display window for the 

* Cohen-Sutherland clipping algorithm built into the 

* draw-line algorithm 

* The limits can be freely selected by the user which makes ‘ 

* the draw-line algorithm very flexible. * 

********************************************************************* 


move.w 

#0, clipxule 



move . w 

#0,clipyule 



move.w 

picturex,dl 



lsl. w 

#l,dl 

★ 

times two 

subq.w 

#l,dl 

★ 

minus one equals 

move.w 

dl,clipxlri 

* 

639 for monochrom 

move .w 

picturey,dl 



lsl. w 

#1, dl 

* 

times two minus one 

subq.w 

#1, dl 

* 

equals 399 for monochrome 

move.w 

dl,clipylri 



rts 





* Pass visible surfaces into vplane array and 

* into pladress array for subsequent sorting 

*r 

* of surfaces 


hideit: 


move. w 

numsurf, dO 

* 

Number of surfaces as 

ext. 1 

dO 

* 

counter 

subq.1 

#1, dO 



move.1 

#viewx,al 

* 

The point 

move.1 

#viewy,a2 

* 

coordinates are stored here 

move.1 

#viewz,a3 



move.1 

#wplane,aO 

* 

Here is the information 

move.1 

fvplane,a5 

* 

for every surface 

move.w 

#0,surfcount 

* 

Counts the known visible surfaces. 

move.1 

tpladress,a6 

* 

Address of surface storage 

move.w 

(aO) ,dl 

* 

Start with first surface 

ext. 1 

dl 

* 

Number of points on this surface in Dl 

move. w 

2 (aO),d2 

* 

Offset of first point of this surface 


229 





ST 3D Graphics 


Abacus Software 


A 


doit 1: 


move.w 

4 <a0),d3 

* 

Offset of second point 

move.w 

8 (aO),d4 

* 

Offset of third point 

subq.w 

#l,d2 

* 

For access to point array 

subq.w 

#1, d3 

* 

subtract one from current 

subq.w 

#1, d4 

* 

point offset. 

lsl. w 

#1/ d2 

* 

Multiply by two 

lsl. w 

#l,d3 



lsl -w 

#1, d4 

★ 

and access current 

move. w 

(al,d3.w),d6 

* 

point coordinates 

cmp. w 

(al,d4.w), d6 

* 

Comparison recognizes two point 

bne 

doit 1 

★ 

with the same coordinates 



★ 

created through 

move.w 

(a2,d3.w) ,d6 

* 

construction of 

cmp. w 

(a2,d4.w) ,d6 

★ 

rotation bodies. When 

bne 

doitl 

★ 

two points are found 

move.w 

(a3,d4.w),d6 

★ 

where all point coordinates (x. 

cmp. w 

(a3,d3.w),d6 

★ 

match, the program selects the 

bne 

doitl 

* 

third point to find 

move. w 

12(aO),d4 

* 

both vectors 

subq.w 

#l,d4 



lsl .w 

#l,d4 




move.w 

(al,d3.w),d5 

* 

the two vectors which 

move.w 

d5, kx 

* 

lie in the surface plane 

sub.w 

(al,d2.w),d5 

* 

are found by subtracting the 

move.w 

d5,px 

* 

coordinates of two points 

move.w 

<a2,d3.w),d5 

* 

in this surface 

move.w 

d5, ky 

* 

the direction coord, of the 

sub. w 

<a2,d2.w),d5 

* 

vectors is stored in 

move. w 

d5,py 

* 

variables qx,qy,qz and 

move. w 

(a3,d3.w),d5 

* 

px,py,pz 

move. w 

d5, kz 



sub. w 

(a3,d2.w),d5 



move.w 

d5, pz 



move.w 

(al,d4.w),d5 

* 

Calculate vector Q 

sub. w 

(al,d2.w),d5 



move.w 

(a2,d4.w),d6 



sub. w 

(a2,d2.w),d6 



move.w 

(a3,d4.w),d7 



sub. w 

(a3,d2.w),d7 




230 


Abacus Software 


ST 3D Graphics 


move. w 

d5,dl 


* qx 

move.w 

d6,d2 


* qy 

move.w 

d7,d3 


* qz 

mu Is 

py,d3 


* Compute cross product 

mu Is 

pz, d2 


* of the vector perpendicular 

sub.w 

d2,d3 


* to the current surface 

move. w 

d3, rx 



mu Is 

pz, dl 



mu Is 

px,d7 



sub.w 

d7, dl 


* The direction coordinates of 

move.w 

dl, ry 


* the vector perpendicular to 

mu Is 

px, d6 


* the surface are stored 

mu Is 

py,d5 


* in rx,ry,rz 

sub - w 

d5,d6 



move. w 

d6, rz 



move. w 

prox,dl 


* The projection center serves as 

sub.w 

kx, dl 


* comparison point for the visibility 

move .w 

proy,d2 


* of a surface which seems 

sub.w 

ky,d2 


* adquate for the viewing 

move. w 

proz,d3 


* situation. The observation 

sub.w 

kz, d3 


* ref. point can also 

mu Is 

rx, dl 


* be used as the comparison point. 

muls 

ry,d2 


* Compare vector R and 

mu Is 

rz, d3 


* the vector from one 

add. 1 

dl,d2 


* point of the surface to 

add. 1 

d2,d3 


* the projection center by forming 

bmi 

dosight 


* the scalar product of the two vector: 

scalar product is negative, surface is visible 

move.w 

(aO),dl 

* 

Number of lines in surface 

ext. 1 

dl 



lsl.l 

#2, dl 

★ 

Number of lines times 4 = space for line 

addq.1 

#2, dl 

* 

plus 2 bytes for number of lines 

add. 1 

dl, aO 

★ 

add to surface array for 

dbra 

dO,visible 

* 

access to next surface 

bra 

bideend 

* 

All surfaces processed ? End 


231 





ST 3D Graphics 


Abacus Software 


dosight: move.w (aO),dl * Number of lines for this surface 

ext.1 dl * multiplied by two results in 


************* 

** Changes from the program rotl.s 
* * 

********************************** 

move.1 dl,d2 

lsl.l #l,dl 

move.l a0,a4 

addq.l #2,a4 

move.w #0,zsurf 

sight2: move.l (a4)+,d6 

swap d6 

subq.w #l,d6 

lsl.w #1,d6 

move.w (a3,d6.w),d6 

add.w d6,zsurf 

dbra d2,sight2 

move.w zsurf,d6 

★ 

ext.l d6 

lsr.l #2,d6 

ext.l d6 

move.1 d6, (a6) + 

move.1 aO, (a6) + 

sight3: move.w (a0)+, (a5) + 

dbra dl,sight3 

addq.w #1,surfcount 

bra sight 1 

hideend: rts 


* it 

* * 


* Number of words to be passed 

* Access to first line of the surface 

* Clear addition storage 

* first line of surface 

* first point in lower half of DO 

* fit index 

* fit operand size (2-Byte) 

* Z-coordinate of this point 

* add all Z-coordinates 

* until all lines are computed 

* Divide sum of all Z-coordinates 

* for this 

* surface by the number of lines 

* Surfaces created by rotation 

* always have four lines. 

* Store middle Z-Coordinate 

* followed by address of surface 

* pass number of lines 

* and individual lines 

* increase number of surfaces by one 

* and work on next surface 


232 


Abacus Software 


ST 3D Graphics 


*********************************************************************** 

* Create rotation body by passing parameters, * 

* rotating the definition line, and creating the line and 

* surface arrays * 

*********************************************************************** 

rlset: 


move.1 

#rlxdat,rotxdat 

* 

Pass the 

move. 1 

#rlydat,rotydat 

* 

parameters for 

move.1 

#rlzdat,rotzdat 

* 

rotation body to 

move.1 

#rldatx,rotdatx 

* 

routine for 

move.1 

#rldaty,rotdaty 

* 

creating the 

move.1 

#rldatz,rotdatz 

★ 

rotation body 

move.1 

rotdatx,datx 

* 

array addresses of 

move.1 

move. 1 

rotdaty,daty 

rotdatz,datz 

★ 

the points 

move.w 

rlnumro,numro 

★ 

Number of desired rotations 

move. w 

rlnumpt,numpt 

★ 

Number of points to be rotated 

move.1 

#rllin,linxy 

★ 

Address of line array 

move.1 

rts 

#rlplane,worldpla 

* 

Address of surface array 


rotstart: move.w numpt,dO 

lsl.w #l,dO 

ext.1 dO 

move.1 dO,plusrot 

move.w numpt,nummark 
move.1 rotdatx,pointx 

move.1 rotdaty,pointy 

move.1 rotdatz,pointz 

move.w #0,yangle 

move.w #360,dO 

divs numro,d0 

move.w dO,plusagle 

move.w numro,d0 

ext.l dO 

rloopl: move.1 d0,loopc * as loop counter 

move.l rotxdat,datx 

move.1 rotydat,daty 

move.l rotzdat,datz 

jsr yrot * rotate 


* Rotation of def line 

* numro+1 times about Y-axis 

* Storage for one line 

* Number of points 

* rotated 


* 360 / numro = angle increment 

* per rotation 

* store 

* numro +1 times 


233 



ST 3D Graphics 


Abacus Software 


rotlin: 


rotlopl: 


rotlop2: 


move.1 

pointx,dl 

* add offset 

add. 1 

plusrot,dl 


move.1 

dl,pointx 


move.1 

pointy, dl 


add. 1 

plusrot,dl 


move. 1 

dl,pointy 


move. 1 

pointz,dl 


add. 1 

plusrot,dl 


move.1 

dl,pointz 


move.w 

yangle,d7 


add.w 

plusagle,d7 


move. w 

d7,yangle 


move.1 

loopc,dO 


dbra 

dO,rloopl 


move.w 

rlnumro,numro 


move.w 

rlnumpt,numpt 


jsr 

rotlin 

* Create line array 

jsr 

rotsurf 

* Create surface array 

rts 




move.w 

#1, d7 



move. w 

numro,d4 

* * 

Number of rotations 

ext .1 

d4 



subq.1 

#1, d4 



move. w 

numpt,dl 

★ 

Number of points in def. lin 

subq.w 

#1, dl 

* 

both as counters 

lsl. w 

#2,dl 

★ 

times two 

ext. 1 

dl 



move.1 

dl,plusrot 



move.w 

numpt,d5 

★ 

Number of points minus once 

ext. 1 

d5 

* 

repeat, last line 

subq.1 

#2,d5 

★ 

connect points (n-l,n) 

move.1 

linxy,al 



move.w 

d7,d6 



move.w 

d6, (al) + 

★ 

first line connects 

addq.w 

#l,d6 

★ 

points (1,2) then (2,3) etc. 

move.w 

d6, (al) + 



dbra 

d5,rotlop2 




234 


Abacus Software 


ST 3D Graphics 



move.1 

linxy,dl 




add. 1 

plusrot,dl 




move . 1 

dl,linxy 




move .w 

numpt,dO 




add. w 

d0,d7 




dbra 

d4,rotlopl 




move . w 

numpt,d7 




move.w 

d7,deltal 




lsl. w 

#2,d7 




ext. 1 

d7 




move . 1 

d7,plusrot 




move. w 

#1, d6 




move.w 

numpt,dO 




ext. 1 

dO 




subq.1 

#l,dO 



rotlop3: 

move.w 

numro,dl 




ext. 1 

dl 




subq.1 

#1, dl 




move. w 

d6, d5 



rotlop4 : 

move . w 

d5,(al)+ 

★ 

generate cross 


add. w 

deltal,d5 

* 

connection lines which 


move. w 

d5, (al) + 

* 

connect lines created 


dbra 

dl,rotlop4 

★ 

by rotation 


add.w 

#1, d6 




dbra 

dO,rotlop3 




move.w 

numro,dl 




add. w 

#1, dl 




mu Is 

nummark, dl 




move. w 

dl,rlnummark 




move.w 

numpt,dl 




mu Is 

numro,dl 




move. w 

numpt,d2 




subq.w 

#1, d2 




mu Is 

numro,d2 




add.w 

dl, d2 




235 





ST 3D Graphics 


Abacus Software 


move.w d2,rlnumline * store number of lines 


rt s 


rotsurf: 

move.w 

numro,dO 


ext. 1 

dO 


subq.1 

#1, dO 


move.w 

numpt,d7 


ext. 1 

d7 


subq.1 

#2,d7 


move.1 

d7,plusrot 


move.1 

worldpla,aO 


move.w 

#1/ dl 


move. w 

numpt,d2 


addq.w 

#l,d2 

rotf11: 

move.1 

plusrot,d7 

rotf12: 

move.w 

dl, d4 


move.w 

d2,d5 


addq.w 

#l,d4 


addq.w 

#1, d5 


move.w 

#4, (aO) + 


move.w 

dl, (aO) + 


move.w 

d4, (aO) + 


move.w 

d4, (aO) + 


move.w 

d5,(aO)+ 


move.w 

d5,(aO)+ 


move.w 

d2,(aO)+ 


move.w 

d2, (aO) + 


move.w 

dl, (aO) + 


addq.w 

#1, dl 


addq.w 

#1, d2 


dbra 

d7,rot f12 


addq.w 

#1, dl 


addq.w 

#1, d2 


dbra 

dO,rotf11 


move.w 

numpt, dl 


subq.w 

#1, dl 


muls 

numro,dl 


* Create surfaces of 

* rotation body 

* Number of points minus one 

* repeat 

* Address of surface array 

* Number of points 

* Offset 

* Number of lines/surfaces 

* first surface created here 


236 


Abacus Software 


ST 3D Graphics 


move.w dl,rlnumsurf 
rts 


* Pass data and parameters to the link file routines 


wrld2set: move.1 
move -1 
move.1 
move.1 
move.1 
move . 1 
move.1 
move. w 
move. w 
move.w 
move.w 
move. 1 
move. 1 
move.w 
move.w 
move.w 
rts 


#wrldx,datx 
#wrldy,daty 
#wrldz,datz 
#viewx,pointx 
#viewy,pointy 
#viewz,pointz 
#wlinxy,linxy 
picturex,xO 
picturey, yO 
proz,zobs 
rlzl,dist 
#screenx,xplot 
#screeny,yplot 
rlnumline,numline 
rlnummark,nummark 
rlnumsurf,numsurf 


* Sort surfaces stored in pladress 


sort it: 

move. 1 

#pladress,aO 


move. w 

surfcount,d7 


ext. 1 

d7 


subq. 1 

#2, d7 


bmi 

serror 


move. 1 

#l,dl 

sortmain: 

move . 1 

dl, d2 


subq.1 

#l,d2 


move.1 

dl, d3 


lsl.1 

#3, d3 


*********************************** 

★ 

*********************************** 

* for i = 2 to n corresponds to 

* for i = 1 to n-1 because of 

* different array structure 

* j = i -1 

* i 


237 











ST 3D Graphics 


Abacus Software 



move.1 

(a0,d3.1) ,d5 

* 

Comparison value x = a[i] 


move.1 

4(aO,d3.1),d6 

h 

Address of surface 


move. 1 

d5,platz 

* 

a [0] = x = a [-1] in 


move.1 

d6,platz+4 

* 

this array 

sortlopl: 

move.1 

d2, d4 

* 

j 


lsl.l 

#3, d4 

* 

j times 8 for access to array 


cmp. 1 

(aO,d4.1),d5 

* 

Z-coordinate of surface 


bge 

sortwl 

* 

while x < a[j] do 


move. 1 

(aO, d4.1), 8(aO,d4 

1.1) * a [ j + 1] = a [ j] 


move.1 

4(aO,d4.1),12(aO, 

d4.1) * Address of surface ar: 


subq.1 

#1, d2 


* j = 3-1 


bra 

sortlopl 



sortwl: 

move. 1 

d5, 8 (aO, d4.1) 

* 

a Cj+1] = x 


move. 1 

d6, 12(aO,d4.1) 

* 

pass address also 


addq. 1 

#1, dl 

* 

i = i + 1 


dbra 

d7, sortmain 

* 

until all surfaces are sorted 

sortend: 

rts 




serror: 

rts 


* 

On error simply return 


* Fill surfaces stored in pladress * 


paintit: 


jsr 

setclip 

* 

GEM clipping routine for Filled Area 

jsr 

sortit 

Hr 

Sort surfaces according to Z-coords. 

move.w 

#1, dO 

* 

Write mode to replace 

jsr 

filmode 



jsr 

filform 

* 

border filled surfaces 

jsr 

filcolor 

* 

Fill color is one 

move.w 

#2,dO 

★ 

Fill style 

jsr 

filstyle 



move.1 

xplot,al 

* 

Address of screen coordinates 

move.1 

yplot,a2 



move.w 

surfcount,d7 


* Number of surfaces to be filled 

ext. 1 

d7 

Hr 

as counter 

subq.1 

#1/ d7 

* 

access to last surface in the array 

move.1 

d7, dO 

* 

multiply by eight 

lsl.l 

#3, dO 




238 


Abacus Software 


ST 3D Graphics 


pa inti: 


paint2: 


paint3: 


move.1 

#pladress,aO * here 

are the surfaces 

move.1 

(a0,d0.1),d5 * largest Z-coordinate 

move. 1 

#0, dl 


move. 1 

(aO,dl.1), d6 * first surface in array 

neg. 1 

d6 * smallest Z-coordinate 

add. 1 

d6,d5 * subtract from each other 

move. 1 

d5,d0 


move.1 

(a0,dl.l),d2 * first surface in array 

add. 1 

d6, d2 * plus 

smallest Z-coordinate 

lsl.l 

#3,d2 * times eight, eight different 

divs 

d0,d2 * fill 

patterns, divide by difference 

neg.w 

d2 * leave out last pattern 

add. w 

#6,d2 


bpl 

paint2 


move.w 

#1, d2 


move•w 

d2,d0 

* Set fill index 

jsr 

filindex 


move. 1 

#ptsin,a3 

* Enter points here 

move. 1 

4(a0,dl.l),a6 

* Address of surface 

move. w 

(a6)+,d4 

* Number of lines 

addq. w 

#1, d4 

* first point counts double 

move. w 

d4,contrl+2 


move. 1 

(a6)+,d3 

* first line of surface 

swap 

d3 


subq.w 

#1, d3 


lsl. w 

#1, d3 


move.w 

(al,d3.w),(a3)+ 

* transfer to ptsin array 

move.w 

(a2, d3 . w) , (a3) + 

* transmit Y-coordinate 

swap 

d3 


sub. w 

#l,d3 


lsl. w 

#1, d3 


move.w 

(al, d3 . w) , (a3) + 

* transmit next point 

move.w 

(a2,d3 .w) ,(a3)+ 

* transmit Y-coordinate 

subq.w 

#3,d4 

* two points already transmitted 

ext. 1 

d4 

* one because of dbra 

move.1 

(a6)+,d3 

* next line 

subq.w 

#1, d3 


lsl -W 

#1, d3 


move.w 

(al,d3 .w) ,(a3)+ 

* X-coordinate 

move.w 

(a2,d3.w), (a3) + 

* Y-coordinate 

dbra 

d4,paint3 

* until all points in ptsin arra; 


239 




ST 3D Graphics 


Abacus Software 


move.w 

#9,contrl 

* 

then call the 

move.w 

#0,contrl+6 

* 

function Filled 

move. w 

grhandle,contrl+12 

* 

Area 

movem.1 

d0-d2/a0-a2,- (a7) 



jsr 

vdi 



movem.1 

U7)+,d0-d2/a0-a2 



add. 1 

#8, dl 

* 

work on next 

dbra 

d7,paintl 

* 

surface in plad. 

rts 





* VDI clipping, used only with VDI functions, also for * 

* filling surfaces. * 


setclip: 


move.w 

#129,contrl 

move. w 

#2,contrl+2 

move.w 

#1,contrl+6 

move.w 

grhandle,contrl+12 

move.w 

#1,intin 

move. w 

clipxule,ptsin 

move . w 

clipyule,ptsin+2 

move. w 

clipxlri,ptsin+4 

move.w 

clipylri,ptsin+6 

jsr 

vdi 

rts 



. even 


* Start of variable area * 

* * 


* Data area for rotation body * 

.bss 


240 


Abacus Software 


ST 3D Graphics 


numro: 
numpt: 

rotxdat: 
rotydat: 
rotzdat: 

rotdatx: 
rotdaty: 
rotdatz: 

rlnumline: 
rlnummark: 
rlnumsurf: 

plusagle: 

rldatx: 
rldaty: 
rldatz: 

rllin: 
rlplane: 


rlxdat: 

rlydat: 

rlzdat: 

rlnumpt: 
rlnumro: 


.ds.w 1 

.ds.w 1 

. ds . 1 1 

.ds.l 1 

.ds.l 1 

.ds.l 1 

.ds.1 1 

.ds.l 1 

.ds.w 1 

.ds.w 1 

.ds.w 1 


.ds.w 1 

.ds.w 1540 

.ds.w 1540 

.ds.w 1540 

•ds.l 3200 * 4-Bytes for every line 

.ds.l 6600 


.data 


.dc.w 0,40,50,50,20,30,20,30,70,80,80,0 


.dc.w 100,100, 80 ,60,40,30,30,-70,-80,-90,-100,-100 


.dc.w 0 , 0 , 0 , 0 , 0 , 0,0,0,0, 0,0, 0 


.dc.w 12 

.dc.w 8 * Number of rotations for creation 


241 








ST 3D Graphics 


Abacus Software 




* * 

* * 

* Definition of the house * 

* * 





• data 


housdatx: 

.dc.w 

-30,30,30,-30,30,-30,-30,30,0,0,-10,-10,10,10 


. dc. w 

30,30,30,30,30,30,30,30,30,30,30,30 

housdaty: 

. dc. w 

30,30,-30,-30,30,30,-30,-30,70,70,-30,0,0,-30 


. dc. w 

20,20,0,0,20,20,0,0 


.dc. w 

-10,-10,-30,-30 

housdatz: 

.dc .w 

60,60, 60, 60,-60,-60,-60,-60, 60,-60, 60,60, 60, 60 


.dc.w 

40,10,10,40,-10,-40,-40,-10 


.dc. w 

0,-20,-20,0 

houslin: 

.dc.w 

1,2,2,3,3, 4,4,1,2,5, 5, 8,8, 3, 8,7, 7, 6, 6, 5, 6,1,7, 4 


.dc.w 

9,10,1,9,9,2,5,10,6,10,11,12,12,13,13,14 


.dc.w 

15,16, 16, 17,17,18; 18, 15,19,20,20,21,21,22,22, 19 


.dc.w 

23,24,24,25,25,26,26,23 


* here are the definitions of the surfaces for the House * 

* * 


houspla: 

.dc. 

w 

4, 

1 ,2,2,3,3,4,4, 

1,4,2,5,5,8, 

8,3, 

3,2 



.dc. 

w 

4, 

5,6, 6,7,7,8,8, 

5, 4,7, 6, 6,1, 

1*4, 

4,7 



.dc. 

w 

4, 

4,3,3,8,8,7,7, 

4,4,2, 9, 9,10 

, 10, 

5,5, 

2 


.dc. 

w 

4, 

10,9,9,1,1,6,6 

,10,3,1, 9, 9, 

2 ,2, 

1 



.dc. 

w 

3, 

5,10,10,6,6,5, 

4,11,12,12,13,13 

*14, 

14,11 


.dc. 

w 

4, 

15,16,16,17,17 

,18,18,15,4, 

19,2 

0,20 

,21,21,22,22,19 


-dc. 

w 

4, 

23,24,24,25,25 

,26,26,23 




hnuinmark: 

.dc. 

w 

26 

* Number 

of corner points 

in 

the house 

hnumline: 

. dc. 

w 

32 

* Number 

of lines in 

the 

house 

hnumsurf: 

.dc 

:. w 

13 * Number 

of surfaces 

in the house 


242 


Abacus Software 


ST 3D Graphics 


hxangle: 

.dc.w 

0 

★ 

Rotation angle of house about X-axis 

hyangle: 

. dc. w 

0 

★ 

" ” " Y-axis 

hzangle: 

.dc.w 

0 

* 

■' " " Z-axis 

xwplus: 

.dc.w 

0 

★ 

Angle increment about X-axis 

ywplus: 

• dc.w 

0 

★ 

Angle increment about Y-axis 

zwplus: 

• dc.w 

0 

★ 

Angle increment about Z-axis 

picturex: 

.dc.w 

0 

* 

Definition of zero point of display 

picturey: 

.dc.w 

0 

* 

entered by getreso 


rotdpx: 

.dc.w 

0 

rotdpy: 

.dc.w 

0 

rotdpz: 

.dc.w 

0 


rlzl: 

.dc.w 

0 

normz: 

.dc.w 

1 



.bss 


plusrot: 

.ds.l 

1 

first: 

• ds .w 

1 

second: 

.ds. w 

1 

deltal: 

.ds. w 

1 

worldpla: 

.ds.l 

1 


.data 


plag: 

.dc .b 

1 


. even 



.bss 


diffz: 

.ds. w 

1 


243 




ST 3D Graphics 


Abacus Software 


dx: 

. ds. w 

1 


dy: 

. ds. w 

1 


dz: 

. ds. w 

1 


wrldx: 

.ds .w 

1600 

* World coordinate array 

wrldy: 

.ds. w 

1600 


wrldz: 

• ds. w 

1600 


viewx: 

.ds. w 

1600 

* View coordinate array 

viewy: 

• ds. w 

1600 


viewz: 

. ds. w 

1600 


screenx: 

.ds .w 

1600 

* Screen coordinate array 

screeny: 

.ds. w 

1600 


wlinxy: 

-ds. 1 

3200 

* Line array 


wplane: 

• ds. 1 

6600 

* Surface array 

vplane: 

-ds. 1 

6600 

* Surface array of visible surfaces 

platz: 

.ds. 1 

2 


pladress: 

• ds.l 

3000 

* Surface array 

surfcount: 

.ds .w 

1 


numsurf: 

. ds. w 

1 


zcount: 

.ds.l 

1 

* Sum of all Z-coord. 

zsurf: 

• ds. w 

1 

* Individual Z-coord.of surface 

sx: 

-ds. w 

1 


sy: 

.ds. w 

1 


sz : 

.ds .w 

1 


px: 

-ds. w 

1 


py: 

• ds. w 

1 


pz: 

.ds. w 

1 



244 


Abacus Software 


ST 3D Graphics 


rx: 

.ds. w 

1 


ry: 

. ds. w 

1 


rz: 

. ds. w 

1 


qx: 

.ds. w 

1 


qy: 

.ds. w 

1 


qz: 

.ds.w 

1 


kx: 

. ds. w 

1 


ky: 

• ds.w 

1 


kz: 

• ds.w 

1 



. data 



prox: 

.dc.w 

0 

* Coordinates of projection 

proy: 

.dc. w 

0 

* center, on the positive 

proz: 

• dc.w 

1500 

* Z-axis 


.data 



of f x: 

.dc.w 

0 

* Transformation through rotation 

of fy: 

• dc.w 

0 

* to point [offx,offy,offz] 

of fz: 

.dc.w 

0 


xoffs: 

.dc.w 

0 

* Inverse transformation to point 

yoffs: 

.dc.w 

0 

* [xoff,yoffs,zoffs] 

zoffs: 

.dc.w 

0 




.bss 


loopc: 

.ds. 1 

. end 

1 


245 







ST 3D Graphics 


Abacus Software 


4.4.1 New things in the main program rotatel.s: 


The creation of a surface array during construction of the rotation body is 
accomplished through the subroutine rotsurf:. The array (rlplane) 
is of course passed from the subroutine makewrld: into the world 
system (wplane). Furthermore, the subroutines hideit:, setclip: 
and paintit: as well as the sort routine sort it: are new and have 
already been explained. This sort routine sorts the array surfaddr, 
which contains the Z-coordinates of the visible surfaces as well as the 
addresses of the visible surfaces, according to increasing Z-coordinates. 
The subroutine sort it: uses the old trick, an additional array index at 
the beginning of the array. You can recognize this by the variable 
space: in the variable part of the program. The variable space: 
reserves additional space for a data record in the surfaddr-arrays. The 
additional space is used as a marker during sorting. The actual sort 
algorithm is nothing but a simple insert sort. For better understanding, 
here is a structogram of the sort algorithm: 



Figure 4.4.4: Structogram of the sort algorithm 


246 







Abacus Software 


ST 3D Graphics 


4.4.2 Sort algorithm: 


In this program too, you should change various parameters to see what 
they do. Up to now you had to change all the parameters in the program 
text. This meant that you had to do a lot of assembling and linking just to 
change a few parameters. The sort algorithm will allow you to change 
parameters while the program is running. One method to change these 
parameters is through a menu. See the diagram below. More about this in 
the next section. 













ST 3D Graphics 


Abacus Software 


4.5 Entering rotation lines with the mouse 


We are now ready to combine the subroutines which we have so far used 
separately and to construct a little program for creating rotation bodies, 
including the removal of hidden lines and shading surfaces. Furthermore, 
we also want to be able to enter the creation lines for the rotation body 
with the mouse so that we don’t have to reassemble the program when we 
want to use a new definition line. Owners of 520ST’s may find 
themselves running short of memory. The available storage space permits 
the input of 25 points for a definition line of the rotation body which can 
then be rotated 60 times about the Y-axis. Thus a maximum of 
25*61 = 1525 points and about 3000 lines and almost 1500 surfaces will 
be created. To store this many parameters as well as the program we need 
about 190Kbytes of memory, about a third of which is wasted because the 
object is defined twice (datx, daty, datz, wrldx, wrldy, 
wrldz). This is done to make things easier, but also in consideration of 
the next main program which displays several objects at the same time. 
We also have to keep in mind the memory require by the two screen 
pages-about 64K 

The amount of memory reserved in this program is intended for use on 
the "smaller" model. Owners of 1 mega byte computers can display larger 
objects if they want by reserving more space for the individual arrays. 
The following relationships as are used to calculate the memory 
requirements: 

Number of points:= rlnumpt * (rlnumo+1) 

Number of lines:= ( (rlnumpt-1) *rlnumro) + 

(r1numpt * r1nuraro) 

Number of surfaces:= (rlnumpt-1) * rlnumro 

The number of lines can be estimated by multiplying the number of 
points by two. Each point naturally requires two bytes of storage space. 
You must also remember that every surface of the rotation body, requires 
18 bytes of storage space since it is always constructed of four lines. In 
the surfaddr array every surface requires 8 bytes of additional storage 
space. With this information you can expand the programs yourself if you 
have a 1040ST. The introduction of the operating system in ROM will 
ease the lack of storage space. About 200K of RAM will be released by 


248 


Abacus Software 


ST 3D Graphics 


using the ROM. If you want to generate rotation bodies with more points 
without RAM enhancement, whether through ROMs or RAM chips, you 
can change the program so that the rotation body is not duplicated in the 
arrays rldatx, rldaty, rldatz, but generated only in the world 
system wrldx, wrldy, wrldz and the definition of rldatx, 
rldaty, rldatz is completely omitted. This will free about 50 
Kbytes of storage which includes the savings from the line array 
(rllin) and surface array (rlplane). This space can be distributed 
over the world array and thus used to generate larger bodies. The product 
of the number of points and the number of rotations plus one is limited. 
You can for example, rotate 16 points 90 times, or 40 points 30 times, etc. 
The only limits placed are those of your imagination. The number of 
rotation points to be entered is determined by the variable maxpoint and 
can be changed there. 

The use of this program differs in a few points from the programs 
presented thus far. After the program start, a menu appears where you can 
determine the desired number of rotations of a rotation line already 
defined in the program. After you press one of the function keys F2 to F8, 
the familiar chess figure appears in the ’’wire model mode" with the 
desired number of rotations. The actual rotation parameters such as 
position of the rotation point and rotation angle increments can be 
changed with the cursor-keys. To remove hidden lines in this rotation 
body press the H key on the keyboard (H for Hide). After the visible 
surfaces have been drawn, you can fill them with a pattern by pressing the 
P key (P for Paint). In both cases you can obtain a hardcopy by pressing 
the <Altemate> and <Help> keys at the same time since the surfaces are 
drawn and in the visible screen page (physical display ). The picture 
drawn on the display remains until the <Retum> key is pressed and 
cannot be changed. As a further option you can fill all the surfaces in the 
"wire model mode" (P key), not only the visible ones. For hardcopy of a 
wire model, press Shift D. By pressing the F10 key you return to the main 
menu and you can enter a new rotation line with FI and the help of the 
mouse. 

After pressing FI a small crosshair and a cartesian coordinate system 
whose origin is the. middle of the screen appear. By clicking the left 
mouse button you can enter up to 25 points for a definition line. The right 
mouse button ends the definition after which you must press a key to 
return to the menu. You can set the number of rotations with the function 
keys. We almost forgot to mention the significance of the F9 function key 
which displays a mouse pointer when pressed in the wire model mode 


249 




ST 3D Graphics 


Abacus Software 


and allows you to set a new coordinate origin on the screen (left mouse 
button). Here are some examples of definition lines and the rotation 
bodies which result. 









Abacus Software 


ST 3D Graphics 









ST 3D Graphics 


Abacus Software 



252 



Abacus Software 


ST 3D Graphics 





ST 3D Graphics 


Abacus Software 








Abacus Software 


ST 3D Graphics 











ST 3D Graphics 


Abacus Software 



Figure 4.5.13 


Don’t let the program listing frighten you. First of all, if you have entered 
the previous programs, all you have to do is enter the new subroutines 
and change the main loop a bit. Second, you can get a disk containing all 
of the programs in the book from Abacus Software or your dealer. 




253882 bytes used 1 


K PRINTERS 
N TUTORIAL 
C FRY 

CONV TTP 
HL10 PRO 
OUTPUT PRG 
SPLIT TTP 
STANDARD PRT 
TEXTPRO PRG 
TUTORIAL TXT 
XTTUTORI TOC 


l 


1442236 bytes used in 123 itens. 


BASIC 

PRG 

138344 

11-2 

BASIC 

RSC 

4648 

11-2 

BASIC 

URK 

346 

11-2 

BASIC1 

BAR 

14801 

11-2 


□ 


OPEN APPLICATION 

Nane: BATCH .TTP 
Parameters: . 

aslink grlinkl nenul|_ 


1 


333356 butes used in 


H0USE1 

PRG 


H0USE1 

S 


MAINi 

PR6 


HAIN1 

HAIN1C0 

S 

PRG 


MAIN1CD 

S 


MENU1 

PRG 


MENU1 

S 


HULTI1 

PRG 

_ 

HULTI1 

S 


PAINT1 

PRG 

■ 

PAIKT1 

R0TATE1 

S 

PRG 

1 

R0TATE1 

S 

■ 
































Abacus Software 


ST 3D Graphics 


*********************************************************************** 

* menul.s 2/18/1986 * 

* Creation of rotation bodies Uwe Braun 1985 Version 2.2 * 

* with hidden line algorithm and painting * 

* * 

.globl main,xoffs,yoffs,zoffs,offx,offy,offz 

•globl viewx,viewy,viewz 

.globl wlinxy,mouse_off,setrotdp,inp_chan,pointrot 

. text 


main: 


mainl: 


mainlopl: 


jsr 

apinit 

* Announce programm 

jsr 

grafhand 

* Get screen handler 

jsr 

openwork 

* Display 

jsr 

mouse off 

* Turn off mouse 

jsr 

getreso 

* Display resolution 

jsr 

setcocli 

* set Cohen Sutherland clip. 

jsr 

clearbuf 


jsr 

menu 


jsr 

makerotl 

* create rotation body 

jsr 

makewrld 

* create world system 

jsr 

wrld2set 

* pass world parameters 

jsr 

pageup 


jsr 

clwork 


jsr 

setrotdp 

* initialize observer ref. point 

jsr 

pagedown 

* Display logical screen page 

jsr 

clwork 


jsr 

inp_chan 



jsr 

pointrot 

* rotate around observ. ref. point 

jsr 

pers 

* Perspective transformation 

jsr 

drawnl 


jsr 

pageup 

* Display physical screen page 

jsr 

testhide 



257 






ST 3D Graphics 


Abacus Software 


jsr 

inp chan * 

Input new parameters 


jsr 

clwork * 

clear page not displayed 

jsr 

pointrot * 

Rotate around rot ref 

. point 

jsr 

pers * 

Transform new points 


jsr 

drawnl 



jsr 

pagedown * 

Display this logical 

page 

jsr 

inp chan * 

Input and change parameters 

jsr 

clwork * 

erase physical page 


jmp 

mainlopl * 

to main loop 


move.1 

physbase,logbase 


jsr 

pageup * 

switch to normal screen page 

rts 

* 

back to link file and 

end 


* Display menu and selection of menu points 


menu: 

jsr 

switch 

* Display and draw the same 


move.1 

#text2,a0 

* screen page 


jsr 

printf 

* Display menu list 


move.1 

#text3,aO 



jsr 

printf 


menuO: 

jsr 

inkey 

* Read keyboard 


swap 

dO 



cmp.b 

#$3b,dO 

* Fl key pressed ? 


bne 

menul 



jsr 

inpmous 

* if yes, enter a line 


bra 

menu 


menul: 

cmp .b 

#$3c,d0 

* F2 key pressed ? 


bne 

menu 2 



move.w 

#4, rlnumro 

* if yes, then initial number of 


bra 

menend 

* rotations to four 


258 


Abacus Software 


ST 3D Graphics 


menu2: 

cmp.b 

#$3d,d0 * F3 key 


bne 

menu 3 


move.w 

#8,rlnumro 


bra 

menend 

menu3: 

cmp.b 

#$3e,d0 * F4 key 


bne 

menu 4 


move.w 

#12,rlnumro 


bra 

menend 

menu*?: 

cmp.b 

#$3f,dO * F5 key 


bne 

menu 5 


move.w 

#18, rlnumro 


bra 

menend 

menu5: 

cmp.b 

#$40,dO * F6 key 


bne 

menu6 


move. w 

#24,rlnumro 


bra 

menend 

menu6: 

cmp.b 

#$41,dO * F7 key 


bne 

menu7 


move. w 

#45,rlnumro 


bra 

menend 

menu7: 

cmp.b 

#$42,dO * F8 key 


bne 

menu 8 


move.w 

#60,rlnumro 


bra 

menend 

menu8 : 


* Room for 

menu9: 

cmp. b 

#$44,dO * F10 key 


bne 

menuO 


addq.1 

#4,a7 


bra 

ma inend 

menend: 

rts 



additional 


keyboard commands 


259 




ST 3D Graphics 


Abacus Software 


***************************************************************** 

* Test if removal of hidden surface and shading of surfaces * 

* is desired * 

***************************************************************** 


jsr 

inkey 

* 

Read keyboard 

swap 

dO 



cmp.b 

#$23,dO 

★ 

h key pressed ? 

beq 

dohide 

* 

if yes, call hideit 

cmp .b 

#$19,dO 

* 

p key pressed ? 

beq 

dopaint 

* 

is yes, shade 

rts 


★ 

if not, return 


★A***************************************************************** 

* Call hideit routine to remove hidden Surfaces * 

******************************************************************* 


dohide: 

jsr 

switch 


jsr 

clwork 


jsr 

hideit 


jsr 

surfdraw 

dohidel: 

jsr 

inkey 


swap 

dO 


cmp.b 

#$19,dO 


beq 

dopain2 


cmp.b 

#$lc,d0 


bne 

dohidel 


jsr 

rts 

pageup 

dopain2: 

jsr 

paintit 

dopain3: 

jsr 

inkey 


swap 

dO 


cmp.b 

#$lc,dO 


bne 

dopain3 


jsr 

rts 

pageup 


* or you won't see anything 

* erase display 

* remove 

* and draw 

* shade too ? 

* if yes, call fill routine 

* if not, wait for activation of 

* Return key on main keyboard 

* and back 

* Shade surfaces 


* wait for return key 


260 


Abacus Software 


ST 3D Graphics 


*********************************************************************** 
* Shade all surfaces defined in the world system 
**************,******************************************************** 


dopaint: 

jsr 

switch 



jsr 

clwork 



jsr 

paintall 

* shade all 

dopaintl: 

jsr 

inkey 



swap 

dO 



cmp. b 

#$lc,dO 

* and wait for Return key on the 


bne 

dopaintl 

* main keyboard 


jsr 

pageup 



rts 








* Create the rotation body 


makerot1: jsr 
jsr 
rts 


r lset * Set parameters of this rot. body 

rotstart * Create rot. body 






* Input and change parameters 


inp chan: 

jsr 

inkey 


cmp.b 

#' D',dO 


bne 

inpwait 


jsr 

scrdmp 

inpwait: 

swap 

dO 


cmp.b 

#$4d,d0 


bne 

inpl 


addq.w 

#1,ywplus 


bra 

inpendl 


* Read keyboard, key code in 

* Make hardcopy 

* Test DO for 

* Cursor-right 

* if yes, add one to Y-angle 

* and continue 


261 








ST 3D Graphics 


Abacus Software 


inpl: 

cmp .b 

#$4b,dO 


bne 

inp2 


subq.w 

#1,ywplus 


bra 

inpendl 

inp2: 

cmp .b 

#$50,dO 


bne 

inp3 


addq.w 

#1, xwplus 


bra 

inpendl 

inp3: 

cmp .b 

#$48,dO 


bne 

inp3a 


subq.w 

#1,xwplus 


bra 

inpendl 

inp3a: 

cmp.b 

#$61,dO 


bne 

inp3b 


subq.w 

#1,zwplus 


bra 

inpendl 

inp3b: 

cmp.b 

#$62,dO 


bne 

inp4 


addq.w 

#1,zwplus 


bra 

inpendl 

inp4: 

cmp.b 

#$4e,dO 


bne 

inp5 


sub. w 

#25,dist 


bra 

inpendl 

inp5: 

cmp.b 

#$4a,d0 


bne 

inp6 


add. w 

#25,dist 


bra 

inpendl 

inp6: 

cmp.b 

#$66,dO 


bne 

inp7 


sub.w 

#15,rotdpz 


bra 

inpendl 


* Cursor-left, if yes, subtract 

* one from Y-angle increment 


* Cursor-down, if yes 

* add one to X-angle increment 

* Cursor-up 

* subtract one 

* Undo key 


* Help key 


* plus key on the keypad 

* if yes, subtract 25 from base of 

* projection plane (Z-coordinate) 

* minus key on the keypad 

* 

* if yes, add 25 

* * key on keypad 

* if yes, subtract 15 from rotation 

* point Z-coordinate 

* make changes 


262 




Abacus Software 


ST 3D Graphics 


inp7 : 

cmp -b 

#$65,dO 

* Division key on keypad 


bne 

inp8 



add. w 

#15,rotdpz 

* add 15 


bra 

inpendl 


inp8: 

cmp. b 

#$43,dO 

* F9 pressed ?, if yes, 


bne 

inplO 



jsr 

newmidd 

* display new screen center 


bra 

inpendl 


inplO: 

cmp -b 

#$44,dO 

* F10 pressed ? 


bne 

inpendl 



addq.1 

#4,a7 

* if yes, jump to new input 


bra 

mainl 


inpendl: 

move.w 

hyangle,dl 

* Rotation angle about the Y-axis 


add.w 

ywplus,dl 

* add increment 


cmp. w 

#360,dl 

* if larger than 360, subtract 360 


bge 

inpend2 



cmp. w 

#-360,dl 

* if smaller than 360, 


ble 

inpend3 

* add 360 


bra 

inpend4 


inpend2: 

sub. w 

#360,dl 



bra 

inpend4 


inpend3: 

add. w 

#360,dl 


inpendl: 

move.w 

dl,hyangle 



move.w 

hxangle,dl 

* proceed in the same manner with 


add. w 

xwplus,dl 

* rotation angle about the X-axis 


cmp. w 

#360,dl 



bge 

inpend5 



cmp. w 

#-360,dl 



ble 

inpend6 



bra 

inpend7 


inpend5: 

sub. w 

#360,dl 



bra 

inpend7 


inpend6: 

add.w 

#360,dl 


inpend7: 

move . w 

dl,hxangle 

★ 


263 





ST 3D Graphics 


Abacus Software 



move.w 

hzangle,dl 


add. w 

zwplus,dl 


cmp. w 

#360,dl 


bge 

inpend8 


cmp. w 

#-360,dl 


ble 

inpend9 


bra 

inpendlO 

inpend8: 

sub. w 

#360,dl 


bra 

inpendlO 

inpend9: 

add. w 

#360,dl 

inpendlO: 

move.w 

rt s 

dl,hzangle 


fr***************************************************************** 

* Set the location of the coordinate origin of the screen * 

* system with the mouse * 

****************************************************************** 


newmidd: 

jsr 

switch 




jsr 

mousform 

★ 

change mouse form 

newmiddl: 

move. w 

x0,d2 




move. w 

y0,d3 




jsr 

mouspos 

* 

wait for mouse input 


move. w 

x0,d2 

★ 

must be called for unknown reasons 


move. w 

y0,d3 

★ 

twice for one input of the 


jsr 

mouspos 

* 

Position 


cmp.b 

#$20,dl 

* 

left button ? if not, then 


bne 

newmiddl 

★ 

once more from the beginning 


move. w 

a 

rv> 

*• 

X 

o 

* 

store new coordinates 


move.w 

d3,y0 




rts 





******************************************************************** 

* Determine the current screen resolution * 

********■*********★**********★**************"****'****•***'*■*******■**** 

getreso: move.w #4,-(a7) 

trap #14 

addq.l #2,a7 


264 


Abacus Software 


ST 3D Graphics 



cmp.w 

#2, dO 



bne 

getrl 



move.w 

#320, picturex 

* Monochrome monitor 


move. w 

#200,picturey 



bra 

getrend 


getrl: 

cmp. w 

#1, d0 



bne 

getr2 



move.w 

#320,picturex 

* medium resolution (640*200 


move. w 

#100,picturey 



bra 

getrend 


getr2: 

move. w 

#160,picturex 

* low resolution (320*200) 


move. w 

#100,picturey 


getrend: 

rts 




* Hardcopy of screen, called by inp_chan 


scrdmp: move.w #20,-(al) 

trap #14 

addq.l #2,a7 

jsr clearbuf 

rts 


* Initialize the rotation reference point to [0,0,0] * 


move . w 

#0,dl 

* set the initial rotation 

move.w 

dl, rotdpx 

* ref. point 

move.w 

dl, rotdpy 


move. w 

dl,rotdpz 


move.w 

#0,hyangle 

* initial rotation angle 

move.w 

#0,hzangle 


move.w 

#0,hxangle 


move. w 

#0,ywplus 


move. w 

#0,xwplus 


move -w 

rts 

#0,zwplus 



265 






ST 3D Graphics 


Abacus Software 


* Rotation around the rot. ref. point about all three axes * 


move.w 

hxangle,xangle 

★ 

rotate the world around the 

move. w 

hyangle,yangle 



move. w 

hzangle,zangle 



move.w 

rotdpx,dO 

★ 

rotation ref. point 

move.w 

rotdpy,dl 



move.w 

rotdpz,d2 



move. w 

dO,xoffs 

* 

add for inverse transformation 

move.w 

dl,yoffs 



move.w 

d2,zoffs 



neg. w 

dO 



neg. w 

dl 



neg.w 

d2 



move.w 

dO,offx 

* 

subtract for tranformation 

move.w 

dl,offy 



move. w 

d2,offz 



jsr 

matinit 

★ 

initialize matrix 

jsr 

zrotate 

★ 

rotate 'matrix' about Z-axis 

jsr 

yrotate 

* 

rotate 'matrix' about Y-axis 

jsr 

xrotate 

* 

then rotate about X-axis 

jsr 

rotate 

A 

multiply point with matrix 

rts 





********************************************************************* 

* Set the limit of display window for the Cohen-Sutherland clip * 

* algorithm built into the draw-line algorithm * 

* The limits are freely selectable by the user which makes the * 

* draw-line algorithm very flexible. * 

********************************************************************* 


move. w 

#0,clipxule 



move.w 

#0,clipyule 



move. w 

picturex,dl 



Isl. w 

#1, dl 

* 

times two 

subq.w 

#1, dl 

■k 

minus one equals 

move. w 

dl,clipxlri 

* 

639 for monochrome 

move.w 

picturey,dl 



lsl. w 

#l,dl 

★ 

times two minus one equals 

subq.w 

#1, dl 

* 

399 for monochrome 


266 




Abacus Software 


ST 3D Graphics 


move.w dl,clipylri 
rt s 


* Transfer object data into the world system . 


makewrld: 

move.1 

trldatx,al 


move. 1 

trldaty,a2 


move.1 

#rldatz,a3 


move. 1 

#wrldx,a4 


move. 1 

#wrldy,a5 


move . 1 

#wrldz,a6 


move. w 

rlnummark,dO 


ext. 1 

dO 


subq. 1 

#l,dO 

makewll: 

move.w 

(al) +, <a4) + 


move.w 

(a2) +, (a5) + 


move.w 

(a3)+,(a6)+ 


dbra 

dO,makewll 


move.w 

rlnumline,dO 


ext. 1 

dO 


subq.1 

#1, dO 


move.1 

#rllin,al 


move. 1 

twlinxy,a2 

makewl2: 

move. 1 

(al) +, (a2) + 


dbra 

d0,makewl2 


move.1 

worldpla,aO 


move.1 

#wplane,al 


move.w 

rlnumsurf,dO 


ext. 1 

dO 


subq.1 

#1, dO 

makewld: 

move. w 

(aO) +,dl 


move. w 

dl, (al) + 


ext. 1 

dl 


subq. 1 

#1, dl 

makewl4: 

move . 1 

(aO)+,(al)+ 


dbra 

dl, makew!4 


* create the world system through 

* copying the point coordinates 

* into the world system 


* Number of lines 


* Copy lines into world Line 

* array 

* Adress of surface definition 

* of the body, 

* Number of surfaces on the body 

* as counter 

* All lines in this surface, 

* and of course the number of 

* surfaces copied to world surface 

* array 

* copy every line of this surface 

* to the world array 


267 




ST 3D Graphics 


Abacus Software 


wrldset: 


dbra 

d0,makewl3 * 

until all surfaces are 

completed 

rts 




move. 1 

#wrldx,datx * 

Pass variables for 


move.1 

#wrldy,daty * 

the rotation routine 


move.1 

#wrldz,datz 



move.1 

#viewx, pointx 



move.1 

#viewy,pointy 



move -1 

fviewz,pointz 



move.1 

Iwlinxy,linxy 



move.w 

picturex,xO * 

Coordinate source for 

the 

move.w 

picturey,yO * 

screen system 


move.w 

proz,zobs * 

projection center 


move.w 

rlzl,dist * 

position of projection 

plane 

move.1 

tscreenx,xplot 



move.1 

iscreeny,yplot 



move, w 

hnumline,numline 



move, w 

hnummark,nummark 



move.w 

hnumsurf,numsurf 



rts 





268 






Abacus Software 


ST 3D Graphics 


********************************************************************* 
* Enter visible surface into the vplane array 
********************************************************************* 


hideit: 


visible: 


move . w 

numsurf, dO 

* 

Number of surfaces as counter 

ext. 1 

dO 



subq.1 

#1* dO 



move.1 

#viewx,al 

* 

point coordinates stored here 

move . 1 

#viewy,a2 



move.1 

ffviewz, a3 



move.1 

#wplane,aO 

★ 

here is information for every 

move. 1 

#vplane,a5 

★ 

surface 

move.w 

#0,surfcount 

* 

counts the known visible surfaces 

move.1 

#pladress,a6 

* 

Address of the surface storage 

move.w 

(aO),dl 

★ 

start with first surface, number 

ext. 1 

dl 

* 

of points in this surface in Dl 

move.w 

2(aO),d2 

* 

Offset of first point of this surface 

move.w 

4(aO),.d3 

* 

Offset of second point 

move. w 

8(aO),d4 

★ 

Offset of third point 

subq.w 

#1, d2 

* 

Subtract one from current point offset 

subq. w 

#1, d3 

★ 

for access to point srray 

subq.w 

#l,d4 



lsl. w 

#lf d2 

★ 

then multiply by two 

lsl. w 

#l,d3 



lsl. w 

#l,d4 

* 

and finally access the current 

move. w 

(al,d3.w),d6 

* 

point coordinates 

cmp. w 

(al,d4.w),d6 

★ 

comparison recognizes two points 

bne 

doitl 

★ 

with some coordinates which can occur 

move. w 

(a2,d3.w) ,d6 

★ 

during construction of rotation 

cmp. w 

(a2,d4.w),d6 

* 

bodies. If two 

bne 

doitl 

★ 

points where all point coordinates 

move.w 

(a3,d4.w),d6 

★ 

(x,y,z) match, the program selects 

cmp.w 

<a3,d3.w),d6 

* 

a third point to determine the two 

bne 

doitl 

★ 

vectors 

move . w 

12 (aO) , d4 



subq.w 

#l,d4 



lsl. w 

#1, d4 




269 





ST 3D Graphics 


Abacus Software 


doit1: 


* 


★ 


move.w 

(al,d3.w) ,d5 

* here the two vectors which lie in 

move.w 

d5, kx 

* surface plane are detemined by 

* subtraction 

sub. w 

(al, d2.w),d5 

* of coordinates from two points of 

move.w 

d5, px 

* points in this surface 

move.w 

(a2,d3.w),d5 


move.w 

d5, ky 

* the direction coordinates of the 

sub. w 

(a2,d2.w),d5 

* vector are stored in the variable; 

move.w 

d5,py 

* qx,qy,qz and px,py,pz 

move. w 

(a3, d3 . w) , d5 


move.w 

d5, kz 


sub. w 

(a3,d2.w),d5 


move.w 

d5,pz 


move.w 

(al,d4.w),d5 

* calculation of vector Q 

sub. w 

<al,d2.w),d5 


move.w 

(a2,d4.w),d6 


sub. w 

(a2,d2.w),d6 


move. w 

{a3, d4.w),d7 


sub. w 

(a3, d2.w),d7 


move. w 

d5, dl 

* qx 

move.w 

d6,d2 

* qy 

move. w 

d7,d3 

* qz 

mu Is 

py,d3 

* calculation of the cross product 

mu Is 

pZ/ d2 

* of the vector perpendicular to 

* the surface 

sub.w 

d2,d3 


move.w 

d3, rx 


muls 

pz, dl 


mu Is 

px, d7 


sub. w 

d7, dl 

* the direction coordinates of 

* the vector 

move.w 

dl, ry 

* which is perpendicular to the 

muls 

px, d6 

* surface area stored temporarily 

muls 

py,d5 

* rx,ry,rz 

sub. w 

d5,d6 


move.w 

d6, rz 


move.w 

prox,dl 

* The projection center is used as 

sub.w 

kx, dl 

* the comparison point for the 


270 






Abacus Software 


ST 3D Graphics 


move.w 

proy,d2 

★ 

visibility of a surface, which is 

sub. w 

Jcy,d2 

★ 

adequate for this viewing 

move. w 

proz,d3 

* 

situation. One can also use 

sub.w 

kz, d3 

* 

the observation ref. point 

mu Is 

rx, dl 

* 

as the comparison point. 

mu Is 

ry,d2 

* 

Now follows the comparison of the 

muls 

rz, d3 

* 

vector R and the vector from 

add. 1 

dl, d2 

* 

one point on the surface to the 

add. 1 

d2,d3 

* 

projection center by creating the 

bmi 

dosight 

★ 

scalar product of the two vectors 


* the surface is visible, otherwise continue with next surface. 

move.w (aO),dl * Number of lines in surface 
ext.1 dl 

lsl.l #2,dl * Number of lines times 4 = space for lines 

addq.l #2,dl * plus 2 bytes for the number of lines 

add.1 dl,aO * add to surface array, for access to 

sight1: dbra dO,visible * next surface. If all surfaces 

bra hideend * completed, go to end. 

dosight: move.w <aO),dl * Number of lines in this surface 

ext.l dl * multiplied by two gives result of 

move.l dl,d2 

lsl.l #l,dl * number of words to be transmitted 

move.l a0,a4 

addq.l #2,a4 * Access to first line of surface 

move.w #0,zsurf * Erase addition storage 

(a4)+,d6 * first line of surface 

d6 * first point in lower half of DO 

#l,d6 * adapt Index 

#1,d6 * adapt Operand size (2-byte) 

move.w (a3,d6.w),d6 * Z-coordinate of this point 

add.w d6,zsurf * add all Z-Coordinates 

dbra d2,sight2 * until all lines have been processed 


sight2: move.l 

swap 
subq.w 
lsl. w 


271 






ST 3D Graphics 


Abacus Software 



move. w 

zsurf,d6 

★ 


ext. 1 

d6 

* 


lsr. 1 

#2,d6 

* 


ext .1 

d6 

* 


move. 1 

d6, (a6) + 

* 


move.1 

aO, <a6)+ 

* 

sight3: 

move.w 

(aO)+, (a5) + 

* 


dbra 

dl,sight3 

* 


addq. w 

#1,surfcount 

* 


bra 

sight1 

* 

hideend: 

rts 




Divide sum of all Z-coordinates of 
this surface by the number of lines in 
the surface. Surfaces created by 
rotation always have four lines 

store middle Z-coordinates 
followed by address of surface 

transmit the number of lines 

and the individual lines 

add one to the number of surfaces 
and work on next one 


* Draw all surfaces contained in vplane * 


surfdraw: 



* 

Draws the number of surfaces passed 


move.1 

xplot,a4 

★ 

in surfcount whose descriptions 


move.1 

yplot,a5 




move.1 

#vplane,a 6 

★ 

were entered by hideit in the array 


move.w 

surfcount,dO 

* 

at address vplane 


ext. 1 

dO 




subq.1 

#l,dO 

★ 

if there are no surfaces in the arr. 


bmi 

surfend 

* 

then end. 

surflopl: 

move.w 

(a6) +,dl 

* 

Number of lines in this surface 


ext. 1 

dl 

* 

as counter of lines to be drawn. 


subq.1 

#1, dl 



surflop2: 

move.1 

(a6)+,d5 

★ 

first line of this surface 


subq.w 

#1, d5 

★ 

Access to screen array where 


lsl. w 

#1, d5 

★ 

screen coordinates of points are. 


move. w 

0 (a4,d5.w),d2 




move . w 

0 (a5,d5.w),d3 

★ 

extract points 


swap 

d5 

* 

pass routine. 


272 





Abacus Software 


ST 3D Graphics 


subq. w 

#1, d5 

lsl. w 

#1, d5 

move.w 

0 <a4, d5 . w) , a2 

move.w 

0(a5,d5.w),a3 

jsr 

drawl 

dbra 

dl,surflop2 

dbra 

dO,surflopl 


surfend: rts 


* second point belonging to 

* line 

* draw line, until all lines in this 

* surface are drawn and repeat 

* until all surfaces are drawn. 

* finally return. 


* Set parameters of this rotation body * 


rlset: 


move. 1 

#rlxdat,rotxdat 

move. 1 

#rlydat,rotydat 

move. 1 

frlzdat,rotzdat 

move.1 

#rldatx,rotdatx 

move.1 

#rldaty,rotdaty 

move.1 

#rldatz,rotdatz 

move . 1 

rotdatx,datx 

move.1 

rotdaty,daty 

move. 1 

rotdatz,datz 

move.w 

rlnumro,numro 

move.w 

rlnumpt,numpt 

move.1 

#rllin,linxy 

move.1 

rts 

#rlplane,worldpla 


* Pass parameters of this 

* rotation body to routine 

* for generating the 

* rotation body 

* Array addresses of points 

* Number of desired rotatations. 

* Number of points to be rotated 

* Address of line array 

* Address of surface array 


************** 




* and create rotation body 


•k 

★ 

* 


rotstart: move.w 
lsl. w 
ext .1 
move. 1 


numpt,dO 
#1, dO 
dO 

dO,plusrot 


* Rotate the def line 

* numro+1 times about the Y-axis 

* Storage space for one line 


273 



ST 3D Graphics 


Abacus Software 


rloopl: 


rotlin: 


move.w 

numpt,nummark 

* Number of points 

move.1 

rotdatx,pointx 

* rotate to here 

move. 1 

rotdaty,pointy 


move. 1 

rotdatz,pointz 


move. w 

#0, yangle 


move.w 

#360,dO 

* 360 / numro = angle increment 

divs 

numro,dO 

* per rotation 

move.w 

dO, plusagle 

* store 

move. w 

numro,dO 

* numro +1 times 

ext. 1 

dO 


move.1 

dO, loopc 

* as loop counter 

move.1 

rotxdat,datx 


move.1 

rotydat,daty 


move.1 

rotzdat,datz 


jsr 

yrot 

* rotate 

move.1 

pointx,dl 

* add offset 

add. 1 

plusrot,dl 


move.1 

dl,pointx 


move.1 

pointy,dl 


add. 1 

plusrot,dl 


move.1 

dl,pointy 


move. 1 

pointz,dl 


add. 1 

plusrot,dl 


move.1 

dl,pointz 


move. w 

yangle,d7 


add.w 

plusagle,d7 


move.w 

d7,yangle 


move.1 

loopc,dO 


dbra 

dO,rloopl 


move.w 

rlnumro,numro 


move.w 

r1numpt,numpt 


jsr 

rotlin 

* Create line array 

jsr 

rotsurf 

* Create surface array 

rts 




move. w 

#l,d7 


move.w 

numro,d4 

* Number of rotations 

ext. 1 

d4 


subq.1 

#l,d4 



274 






Abacus Software 


ST 3D Graphics 


rotlopl: 


rotlop2: 


rotlop3: 


rotlop4 : 


move. w 

numpt,dl 

* Number of points in the def. line 

subq.w 

#1, dl 

* both as counter 

lsl. w 

#2, dl 

* times two 

ext. 1 

dl 


move. 1 

dl,plusrot 


move. w 

numpt,d5 

* Number of points minus one 

ext .1 

d5 

* repeat, last line 

subq.1 

#2, d5 

* connects the points (n-l,n) 

move.1 

linxy,al 


move. w 

d7,d6 


move.w 

d6, <al) + 

* the first line connects the 

addq.w 

#l,d6 

* points (1,2) then (2,3) etc. 

move.w 

d6,(al)+ 


dbra 

d5,rotlop2 


move.1 

linxy,dl 


add. 1 

plusrot,dl 


move.1 

dl,linxy 


move.w 

numpt,dO 


add. w 

d0,d7 


dbra 

d4,rotlopl 


move. w 

numpt,d7 


move. w 

d7,deltal 


lsl. w 

#2, d7 


ext. 1 

d7 


move. 1 

d7,plusrot 


move. w 

#1, d6 


move . w 

numpt,dO 


ext. 1 

dO 


subq.1 

#l,dO 


move. w 

numro,dl 


ext. 1 

dl 


subq.1 

#1, dl 


move.w 

d6,d5 


move.w 

d5, (al) + 

* now generate the cross connections 

add. w 

deltal,d5 

* which connect the individual lines 

move.w 

d5, (al) + 

* created by rotation 

dbra 

dl,rotlop4 



275 



ST 3D Graphics 


Abacus Software 


rotsurf: 


add. w 

#l,d6 

dbra 

dO,rotlop3 

move.w 

numro,dl 

add. w 

#l,dl 

mu Is 

nummark,dl 

move.w 

dl,rlnummark 

move.w 

numpt,dl 

mu Is 

numro,dl 

move.w 

numpt,d2 

subq.w 

#1, d2 

mu Is 

numro,d2 

add. w 

dl, d2 

move.w 

rts 

d2,rlnumline * Number of lines stored 


move. w 

numro,dO 

* 

create surfaces of 

the 

ext .1 

dO 

* 

rotation body 


subq.1 

#l,dO 




move. w 

numpt,d7 

* 

Number of points minus one 

ext .1 

d7 

* 

repeat 


subq.1 

#2,d7 




move.1 

d7,plusrot 




move.1 

worldpla,aO 

* 

Address of surface 

array 

move.w 

#1, dl 




move.w 

numpt,d2 

* 

Number of points 


addq.w 

#1, d2 





276 








Abacus Software 


ST 3D Graphics 


rotf11: 
rotf12 : 


move.l plusrot,d7 * Offset 

move.w dl,d4 

move.w d2,d5 

addq.w #l,d4 

addq.w #l,d5 

move.w #4, (aO> + * Number of lines / surfaces 

move.w dl,(aO)+ * the first surface is 

move.w d4,(a0) + * created here 

move. w d4, (aO) + 

move.w d5, (aO) + 

move . w d5, (aO) + 

move . w d2, (aO) + 

move . w d2, (aO) + 

move . w dl, (aO) + 

addq.w #l,dl 

addq.w #l,d2 

dbra d7,rotfl2 

addq.w #l,dl 

addq.w #l,d2 

dbra dO,rotfll 

move.w numpt,dl 

subq.w #1, dl 

muls numro,dl 

move.w dl,rlnumsurf 
rts 


277 


ST 3D Graphics 


Abacus Software 


************************************************************************ 
* Transfer the world parameters and the variables to the link file * 

************************************************************************ 


wrld2set: move.1 
move. 1 
move.1 
move.1 
move.1 
move.1 
move.1 
move.w 
move.w 
move.w 
move.w 
move.1 
move.1 
move.w 
move.w 
move -w 
rts 


#wrldx,datx * 

#wrldy,daty * 

#wrldz,datz * 

#viewx,pointx 
#viewy,pointy 
Iviewz,pointz 
#wlinxy,linxy 
picturex,xO 
picturey,yO 
proz,zobs 
rlzl,dist 
#screenx, xplot 
#screeny,yplot 
rlnumline,numline 
rlnummark,nummark 
rlnumsurf,numsurf 


transfer the world parameters 
and the variables to the 
routines in the link file 


********************************************************************** 
* Sort all surfaces entered in pladress * 


sortit: 


sortmain: 


move.1 

#pladress,aO 




move.w 

surfcount,d7 




ext. 1 

d7 

•* 

for i = 2 

to n corresponds to 

subq.1 

#2, d7 

* 

number of 

runs 

bmi 

serror 

★ 

for i = 1 

to n-1 because of 

move.1 

#1, dl 

* 

different 

array structure 

move.1 

dl, d2 




subq.1 

#l,d2 

★ 

j = i -1 


move.1 

dl, d3 

* 

i 


lsl.l 

#3,d3 




move.1 

(aO, d3.1),d5 

* 

Comparison value x = a[i] 

move.1 

4(a0,d3.1),d6 

* 

address of the surface 

move.1 

d5,space 

* 

a [0] = x 

= a[-l] in this 

move.1 

d6,space+4 

* 

array 



278 






Abacus Software 


ST 3D Graphics 


sortlopl: 

move.1 

d2,d4 

* j 



lsl.l 

#3, d4 

* j times 8 for access to 

array 


cmp. 1 

(a0,d4.1) ,d5 

* Z-coordinate of surface 



bge 

sortwl 

* while x < a[j] do 



move.1 

(a0,d4.1),8(a0,d4 

.1) * a [ j + 1] = a [ j] 



move.1 

4(a0,d4.1),12(aO, 

d4.1) * Address of surface array 


subq.1 

#1, d2 

* j = j-1 



bra 

sortlopl 



sortwl: 

move. 1 

d5,8(aO,d4.1) 

* a[j+1] = x 



move. 1 

d6,12(a0,d4.1) 

* Pass address also 



addq. 1 

#1/ dl 

* i - i + 1 



dbra 

d7,sortmain 

* Until all surfaces have 

been sorted 

sortend: 

rts 




serror: 

rts 


* On error simply return 



******************************************************************** 

* paintall draws all surfaces in world array wplane independent of * 

* their visibility; all surface addresses and middle Z-coordinates * 

* are entered into the pladress array. * 

********«**************+******************************************** 


paintall: 

move.w numsurf,dO 
ext.l dO 

subq.l #l,dO 
bmi pquit 


* Number of surfaces 

* if no surface present 

* then terminate 


move.1 #viewz,a3 

move.l #wplane,aO 

move.w #0,surfcount 

move.l #pladress,a6 


* Surface counter for surfdraw 

* surfaces are entered here 


svisible: 

move.w (aO),dl * all surfaces are visible 

ext.1 dl 

subq.l #l,dl 

move.w #0,zsurf * middle Z-coordinate 

move.l a0,a4 

addq.l #2,a4 


279 



ST 3D Graphics 


Abacus Software 


ssightbl: move.1 

(a4) +,d2 

* first line of surface 

swap 

d2 


subq.w 

#1» d2 


lsl. w 

#1/ d2 



ddoit1: 

move.w 

(a3,d2.w),d6 

* add all Z-coordinates of this 


add. w 

d6,zsurf 

* surface 


dbra 

dl,ssightbl 



move.w 

zsurf,d6 



ext. 1 

d6 

* then divide by four, shifting 


lsr. 1 

#2,d6 

* is possible only with rotation 


ext. 1 

d6 

* bodies since each surface has 


move.1 

d6, <a6)+ 

* exactly four lines otherwise divide 


move.1 

aO, (a6) + 

* by number of lines 


addq.w 

#1,surfcount 

* increment surface counter for surfdraw 


move.w 

(aO),dl 

* AO still points to number of lines 


ext. 1 

dl 

* in this surface 


lsl.l 

#2, dl 

* Number of lines times four (1 long) 


addq.1 

#2, dl 

* 2 bytes for the number of lines 


add. 1 

dl, aO 

* AO points to next surface 


dbra 

dO, svisible 



move.w 

numsurf,surfcount 


jsr 

paintit 

* Fill surfaces in pladress 

pquit: 

rt s 



paintit: 

jsr 

setclip 

* GEM clipping routine for filled area 


jsr 

sortit 

* Sort surfaces according to Z-coordinates 


move.w 

#1, dO 

* Write mode to replace 


jsr 

filmode 



jsr 

filform 

* frame filled surface 


jsr 

filcolor 

* Shading color is one 


move. w 

#2, dO 

* Fill style 


jsr 

filstyle 



move. 1 

xplot,al 

* Address of screen coordinates 


move. 1 

yplot,a2 



move. w 

surfcount, dl * Number of surface to be filled 


ext .1 

d7 

* as counter 


subq.1 

#1, d? 

* access last surface in array 


move.1 

dl , dO 

* multiply by eight 


280 







Abacus Software 


ST 3D Graphics 


lsl.l 
move. 1 
move. 1 
move.1 
move.1 
neg. 1 
add. 1 

paintl: move.1 

move.1 
add. 1 
lsl.l 
divs 
neg.w 
add. w 
bpl 

move.w 

paint2: move.w 

jsr 

move.1 
move.1 
move.w 
addq.w 
move.w 
move.1 
swap 
subq.w 
lsl. w 
move.w 
move.w 
swap 
sub. w 
lsl. w 
move.w 
move.w 
subq.w 
ext .1 

paint3: move.1 

subq.w 
lsl. w 
move.w 
move.w 


#3, dO 

tpladress,aO 
(aO, dO . 1) , d5 
#0, dl 

(aO,dl.1), d6 
d6 

d6,d5 

d5,d0 

(aO,dl.l),d2 

d6,d2 

#3,d2 

dO, d2 

d2 

#6,d2 
paint2 
#1, d2 

d2, dO 
filindex 
#ptsin,a3 
4 (aO, dl. 1) ,a6 
(a6)+,d4 
#1»<34 

d4,contrl+2 
(a6) + ,d3 
d3 

#l,d3 

#l,d3 

<al,d3.w>,(a3)+ 
(a2,d3.w) ,(a3) + 
d3 

#1» d3 
#l»d3 

(al,d3.w),(a3)+ 
(a2, d3 . w) , (a3) + 
#3, d4 
d4 

(a6)+,d3 
#1< d3 
#l,d3 

(al, d3 .w), (a3) + 
(a2, d3 . w), (a3) + 


* here are largest Z-coordinate 

* surfaces 

* first surface in array 

* smallest Z-coordinate 

* subtract from one another 

* first surface in array 

* plus smallest Z-coordinate 

* times eight, eight different 

* shading patterns, divide by 

* difference leave out last 

* pattern. 


* set fill index 

* enter points here 

* Address of surface 

* Number of lines 

* first point counted twice 

* first line of surface 


* transfer to ptsin array 

* pass Y-coordinate 


* transmit next point 

* transmit Y-coordinate 

* already two points transmitted 

* and one because of dbra 

* next line 


* X-coordinate 

* Y-coordinate 


281 



ST 3D Graphics 


Abacus Software 


dbra 

d4,paint3 

* until all 

points in Ptsin-Array 

move.w 

#9,contrl 

* then call 

the fill area 

function 

move. w 

#0,contrl+6 




move.w 

grhandle,contrl+12 




movem.1 

dO-d2/aO-a2,-(a7) 




jsr 

vdi 




movem.1 

(a7)+,d0-d2/a0-a2 




add. 1 

#8, dl 

* work on next surface in 

pladress 

dbra 

d7,paintl 




rts 






* VDI clipping, only needed when VDI functions are used, * 

* for surface filling. 


setclip: 


move.w 

#129,contrl 

move.w 

#2,contrl+2 

move.w 

#1,contrl+6 

move.w 

grhandle,contrl+12 

move.w 

#1,intin 

move.w 

clipxule,ptsin 

move.w 

clipyule,ptsin+2 

move.w 

clipxlri,ptsin+4 

move. w 

clipylri,ptsin+6 

jsr 

vdi 

rts 



******************************************************************* 

* this subroutine allows coordinates to entered with the Mouse 

* The maximum number of points is in the variable maxpoint, and 

* is limited only by storage space 
******************************************************************* 


inpmous: 


jsr 

switch 



move. w 

#5, dO 



jsr 

setform 



move.w 

#1, dO 

* set input mode 

to mouse-reguest 

move.w 

#1, dl 

* wait for mouse 

input which is 

jsr 

setmode 

* terminated by 

key activation and 


282 








Abacus Software 


ST 3D Graphics 


mouslopl: 


mousl: 


mouslop2: 


jsr 

coord * mouse clicking 

move. 1 

#0,adressx 

move.w 

#5,d0 * set polymarker to diagonal cross 

jsr 

marktype 


jsr 

mouspos 

* 

For unknown reasons function must 

move. w 

picturex,d2 

* 

be called twice to work once. 

add. w 

#15,d2 



move.w 

picturey,d3 



sub.w 

#40,d3 



jsr 

mouspos 



cmp .b 

#$20,dl 

* 

wait until the left mouse button is 

bne 

mouslopl 

* 

pressed 

move.1 

#rlxdat,a4 

* 

arrays in which input 

move.1 

#rlydat,a5 

* 

coordinates are entered; enough 

move.1 

#rlzdat,a6 

* 

storage must have been reserved 

move.w 

d2,newx 

* 

store mouse X and Y positions 

move.w 

d3,newy 



jsr 

saveit 

* 

and pass line array 

move.w 

newx,d2 



move.w 

newy,d3 



jsr 

markit 

* 

set a polymarker 

add. 1 

#1,adressx 

* 

increment counter 

nop 




move.w 

newx,altx 



move.w 

newy,alty 



move.w 

altx,d2 

* 

pass old position of the mouse 

move. w 

alty,d3 



jsr 

mouspos 

* 

and call again 

jsr 

mouspos 



cmp .b 

#$21,dl 

* 

if right mouse button, then 

beq 

mousend 

* 

end of mouse input 

cmp.b 

#$20,dl 



bne 

mouslop2 



move.w 

d2,newx 

* 

store mouse coordinates 

move.w 

d3,newy 



jsr 

saveit 

* 

store in array 


283 




ST 3D Graphics 


Abacus Software 

move.w 

newx,d2 

* draw line from (n-1) n'th point 

move.w 

newy,d3 


move.w 

altx,a2 


move. w 

alty,a3 


jsr 

drawl 


move.w 

newx,d2 


move.w 

newy,d3 


jsr 

markit 

* and mark point with marker 

add. 1 

#1,adressx 

* increment counter 

move.1 

adressx,d7 


cmp. 1 

maxpoint,d7 

* and compare with maximum point count 

bne 

mousl 

* if not equal, continue 

move.1 

adressx,dO 


move.w 

dO,rlnumpt 

* Number of points input 

rts 



mousend: move.w 

d2,newx 


move.w 

d3,newy 


move.w 

altx,a2 


move.w 

alty,a3 


jsr 

markit 


jsr 

drawl 

* draw last line 

jsr 

wait 

* and wait for keypress 

jsr 

saveit 


add. 1 

#1,adressx 

* also add last point 

move. 1 

adressx, dO 


move.w 

dO,rlnumpt 

* now store total number of points 

rts 


* finally back to caller 


*********************************************************************** 
* Wait for mouse input, returns also on keyboard input * 

*********************************************************************** 


mouspos: move.w #28,contrl * Mouse input, the desired coordinates 

move.w #1,contrl+2 * where the mouse should appear, 

move.w #0,contrl+6 * are passed in 


284 




Abacus Software 


ST 3D Graphics 


move. w 

grhandle,contrl+12 


move . w 

d2,ptsin 

* 

D2 , 

and D3 

move. w 

d3,ptsin+2 




jsr 

vdi 




move.w 

intout,dl 

* 

the 

result - coordinates 

move. w 

ptsout,d2 

* 

are 

also returned in D2 and 

move . w 

ptsout+2,d3 

* 

D3 


rts 






* Set the polymarker type * 


marktype: move.w 
move. w 
move. w 
move.w 
move.w 
jsr 
rts 


#18,contrl 

#0,contrl+2 

#1,contrl+6 

grhandle,contrl+12 

dO,intin 

vdi 


* determines the appearance of 

* the polymarker, desired 

* type is passed in DO 


* Set a polymarker, number in contrl+2 * 


markit: 


move. w 

#7,contrl 




move. w 

#1,contrl+2 * 

Number of 

points. 

move.w 

#0,contrl+6 * 

case 

only 

one 

move.w 

grhandle,contrl+12 




move. w 

d2,ptsin 




move.w 

d3,ptsin+2 




movem.1 

d0-d2/a0-a2,-(a7) 




jsr 

vdi * 

draw 

marker 

movem.1 

(a7)+,dO-d2/aO-a2 




rts 






285 


ST 3D Graphics 


Abacus Software 


A********************************************************************** 

* Set input mode 

*********************************************************************** 


setmode: 


move. w 

#33,contrl * Set input mode 

move.w 

#0,contrl+2 

move.w 

#2,contrl+6 

move.w 

grhandle,contrl+12 

move.w 

dO,intin 

move.w 

dl,intin+2 * Parameters in DO 

jsr 

vdi 

rts 



* Store coordinates entered in point array * 


sub.w 

picturex,d2 

* Pass mouse coordinates to 

move. w 

d2,(a4)+ 

* rotation line array, with 

sub.w 

picturey,d3 

* adaptation to coordinate system 

neg.w 

d3 


move.w 

d3, (a5) + 


move.w 

#0, (a6) + 


rts 














Abacus Software 


ST 3D Graphics 


********************************************************************** 

* Display and describe the same screen page * 

********************************************************************** 


move.w 

#-l,-(a7) 


* Display of Display Page, 

move.1 

physbase. 

“ (a7) 

* where drawing is made 

move.1 

physbase. 

- (a7) 


move.w 

#5,-(a7) 



trap 

#14 



add. 1 

#12,a7 



rts 





* Change the mouse form * 


setform: 


move. w 

#78, contrl 

* Set mouse 

form 

move.w 

#1, contrl+2 



move.w 

#1,contrl+4 

* passed in 

DO 

move.w 

#1,contrl+6 



move.w 

#0,contrl+8 



move.w 

dO,intin 



jsr 

aes 



rts 





desired shape 


*********************************************************************** 

* Drawing a coordinate system for mouse input * 

*********************************************************************** 


jsr 

clwork. 

* draw coordinate 

move.w 

#0, d2 

* for mouse input 

move.w 

picturey,d3 


move.w 

picturex,d5 


lsl. w 

#1, d5 


move.w 

d5,a2 



287 



ST 3D Graphics 


Abacus Software 


move.w 

d3,a3 

jsr 

drawl 

move.w 

picturex,d2 

move.w 

#0, d3 

move. w 

d2,a2 

move.w 

picturey,d5 

lsl. w 

#1, d5 

move.w 

d5,a3 

jsr 

drawl 

rts 



****************************************************************** 

* remove all characters present in the keyboard buffer * 

****************************************************************** 


clearbuf: 


clearnd: 


move - w 

#$b,-(a7) 

* 

Gemdos fnct. character in Buffer ? 

trap 

#1 



addq.1 

#2,a7 



tst. w 

dO 

* 

if yes, get character 

beq 

clearnd 

* 

if no, terminate 

move.w 

#1,-U7> 

* 

Gemdos fnct. CONIN 

trap 

#1 

* 

repeat, until all characters 

addq.1 

#2,a7 

* 

are removed from the buffer 

bra 

clearbuf 



rts 





* Definition of a custom mouse form - Data in mousforl * 


mousform: 


move.1 

#15,dO 

* permits the definition of 

move.1 

Imousforl,al 

* new mouse form, data is 

move.w 

#111,contrl 

* in mousforl 

move.w 

#0,contrl+2 


move.w 

#37,contrl+6 


move.w 

grhandle,contrl+12 

move.w 

#8,intin 


move.w 

#8,intin+2 



288 











Abacus Software 


ST 3D Graphics 


move.w 

#1,intin+4 

move.w 

#0,intin+6 

move.w 

#1,intin+8 

move.1 

tintin+10,a5 

move.1 

(al)+,(a5)+ 

dbra 

dO,forlop 

jsr 

vdi 

rts 



.even 


* Beginning of the Variable area * 

* * 

* Data area for the rotation body * 



.bss 


numro: 

.ds. w 

1 

numpt: 

.ds. w 

1 

rotxdat: 

.ds.l 

1 

rotydat: 

.ds.l 

1 

rotzdat: 

.ds.l 

1 

rotdatx: 

.ds.l 

1 

rotdaty: 

.ds.l 

1 

rotdatz: 

.ds.l 

1 

rlnumline 

.ds. w 

1 

rlnummark 

.ds. w 

1 

rlnumsurf 

. ds. w 

1 

plusagle: 

.ds. w 

1 

rldatx: 

. ds. w 

1600 

rldaty: 

• ds. w 

1600 

rldatz: 

. ds . w 

1600 


289 






ST 3D Graphics 


Abacus Software 


rllin: .ds.l 3200 * 4-Bytes for every line e 

rlplane: .ds.l 6600 

• data 


rlxdat: .dc.w 0,40,50,50,20,30,20,30,70,80,80,0 

.dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 

rlydat: .dc.w 100,100,80,60,40,30,30,-70,-80,-90,-100,-100 

.dc.w 0,0,0,0,0,0, 0,0, 0,0, 0,0,0,0, 0,0, 0,0, 0,0 

rlzdat: .dc.w 0,0,0,0,0,0,0,0,0,0,0,0 

.dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 

rlnumpt: .dc.w 12 

rlnumro: .dc.w 8 


* * 

* * 

* Definition of the house * 

* * 


************************************************************************ 

.data 

housdatx: .dc.w -30,30,30,-30,30,-30,-30,30,0,0,-10,-10,10,10 

.dc.w 30,30,30,30,30,30,30,30,30,30,30,30 

housdaty: .dc.w 30,30,-30,-30,30,30,-30,-30,70,70,-30,0,0,-30 

.dc.w 20,20,0,0,20,20,0,0 

.dc.w -10,-10,-30,-30 

housdatz: .dc.w 60 , 60 , 60 , 60 ,- 60 ,- 60 ,- 60 ,- 60 , 60 ,- 60 , 60 , 60 , 60,60 

.dc.w 40,10,10,40,-10,-40,-40,-10 

.dc.w 0,-20,-20,0 


290 









Abacus Software 


ST 3D Graphics 


houslin: .dc.w 1,2,2,3,3,4,4,1,2,5,5,8,8,3,8,7,7,6,6,5,6,1,7,4 

.dc.w 9,10,1,9,9,2,5,10,6,10,11,12,12,13,13,14 

.dc.w 15,16,16,17,17,18,18,15,19,20,20,21,21,22,22,19 

.dc.w 23,24,24,25,25,26,26,23 

*********************************************************************** 
* Here is the definition of the surfaces belonging to the house * 

*********************************************************************** 

houspla: .dc.w 4 , 1 , 2 , 2 , 3 , 3 ,4,4,1,4,2,5,5,8,8,3,3,2 

.dc.w 4,5,6,6,7,7,8,8,5,4,7,6,6,1,1,4,4,7 

.dc.w 4,4,3,3,8,8,7,7,4,4,2,9,9,10,10,5,5,2 

.dc.w 4,10,9, 9,1,1, 6,6,10,3,1, 9, 9, 2,2,1 

.dc.w 3,5,10,10,6,6,5,4,11,12,12,13,13,14,14,11 

.dc.w 4 ,15,16,16,17,17,18,18,15,4,19,20,20,21,21,22,22,19 

.dc.w 4,23,24,24,25,25,26,26,23 

hnummark.: .dc.w 26 * Number of corner points in the house 

hnumline: .dc.w 32 * Number of Lines in the House 

hnumsurf: .dc.w 13 * Number of Surfaces in the House 

hxangle: .dc.w 0 * Rotation angle of House about the X-axis 

hyangle: .dc.w 0 * " " " Y-axis 

hzangle: .dc.w 0 * ” " " Z-Axis 


xwplus: 

.dc.w 

0 

* 

Angle increment about 

the 

X-axis 

ywplus: 

.dc.w 

0 

★ 

Angle increment about 

the 

Y-axis 

zwplus: 

.dc.w 

0 

★ 

Angle increment about 

the 

Z-axis 

picturex: 

.dc.w 

0 

★ 

Definition of zero point 

of screen 

picturey: 

.dc.w 

0 

★ 

entered by getreso 




rotdpx: .dc.w 0 
rotdpy: .dc.w 0 
rotdpz: .dc.w 0 


291 


ST 3D Graphics 


Abacus Software 


rlzl: 

. dc. w 

0 

normz: 

. dc. w 

1500 



.bss 



plusrot: 

. ds. 1 

1 


first: 

. ds. w 

1 


second: 

• ds. w 

1 


deltal: 

.ds. w 

1 


worldpla: 

•—i 

w 

T3 

1 



. data 



plag: 

• dc.b 

1 



.even 




.bss 



diffz: 

• ds .w 

1 


dx: 

.ds. w 

1 


dy: 

.ds. w 

1 


dz: 

• ds. w 

1 


wrldx: 

.ds. w 

1600 

* World coordinate array 

wrldy: 

. ds. w 

1600 


wrldz: 

. ds. w 

1600 


viewx: 

. ds. w 

1600 

* View coordinate array 

viewy: 

. ds. w 

1600 


viewz: 

. ds. w 

1600 


screenx: 

. ds. W 

1600 

* Screen coordinate array 

screeny: 

.ds .w 

1600 



292 















Abacus Software 


ST 3D Graphics 


wlinxy: 

.ds. 1 

3200 

* Line array 

wplane: 

.ds. 1 

6600 

* Surface array 

vplane: 

.ds. 1 

6600 

* Surface array of visible surface 

space: 

.ds. 1 

2 


pladress: 

.ds. 1 

3000 

* Surface array 

surfcount 

: .ds.w 

1 


numsurf: 

.ds .w 

1 


zcount: 

.ds. 1 

1 

* Sum of all Z-coord. 

zsurf: 

.ds.w 

1 

* Individual Z-coord. of surface 

sx: 

.ds.w 

1 


sy: 

.ds.w 

1 


sz: 

.ds.w 

1 


px: 

.ds.w 

1 


py: 

.ds.w 

1 


pz: 

.ds.w 

1 


rx: 

.ds.w 

1 


ry: 

• ds.w 

1 


rz: 

• ds.w 

1 


qx: 

.ds.w 

1 


qy: 

.ds. w 

1 


qz: 

.ds.w 

1 


kx: 

.ds.w 

1 


ky: 

.ds.w 

1 


kz : 

.ds.w 

1 



293 


ST 3D Graphics 


Abacus Software 


Hr ************** + ********************★*** 



.data 




• even 



maxpoint: 

.dc. 1 

25 


mousx: 

.dc.w 

0 


mousy: 

• dc.w 

0 


mousbut: 

.dc.w 

0 


kybdstat: 

.dc.w 

0 


altx: 

.dc.w 

0 


alty: 

.dc.w 

0 


newx: 

.dc.w 

0 


newy: 

.dc.w 

0 


adressx: 

.dc. 1 

1 



.data 



prox: 

.dc.w 

0 

* Coordinates of the projections 

proy: 

.dc.w 

0 

* center on the positive 

proz: 

.dc.w 

1500 

* Z-axis 


.data 



of fx: 

.dc.w 

0 

* Transformation during rotation 

of fy: 

.dc.w 

0 

* to point (offx,offy,offz] 

of f z: 

• dc.w 

0 


xoffs: 

• dc.w 

0 

* Inverse transformation to point 

yoffs: 

• dc.w 

0 

* [xoff,yoffs,zoffs] 

zoffs: 

.dc.w 

0 



textl: 

.dc.b 

27,'Y',56,61,' <c) 

Uwe Braun 1985 ',0 

text2: 

.dc .b 

27,'E',27,'p',13,' 

Input ',' 4-Pts ' , ' 


.dc.b 

' 12-Pts ' 



.dc.b 

' 18-Pts 24-Pts 

45-Pts 60-Pts 


.dc.b 

' POS ',' Quit' 

,27,'q',0 

text3: 

.dc.b 

13, 10,' F-l 

F-2 F-3 


.dc.b 

' F-5 F-6 

F-7 F-8 


.dc.b 

' F-9 F-10 

' t 13,0 


-Pts 


F-4 


294 









Abacus Software 


ST 3D Graphics 


mousforl: .dc.w 
.dc.w 
.dc.w 

• dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 

mousdatl: .dc.w 
.dc.w 
.dc.w 

• dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 
.dc.w 

• dc.w 
.dc.w 

.bss 

loopc: .ds.l 

. end 


%11111111111111U 

%iiiiiiiimniii 


%ooooooinuooooo 

%0000110000010000 

%0001001111001000 

%0010010000100100 

%0100100000010010 

%1001000000010100 

%1001000000010100 

%1000100000100101 

%0100011111001001 

%0010000000010010 

%0001111111100101 

%0011111111111001 

%0111111111111111 

%1111111111111110 

%0000000000000000 


1 


295 




ST 3D Graphics 


Abacus Software 


4.5.1 Description of the new subroutines: 


menu: Display a small menu and wait for a function key 

to be pressed. (F10 returns to Desktop 
immediately) 

testhide: Test if H or P key pressed, branch accordingly to 
dohide or dopaint. 

dohide: Calculate visible surfaces and draw. Then check if 

filling is required, if not, wait for <Retum>. 

dopaint: Fill all surfaces of rotation body and wait for 

<Retum>. 

paint a 11: Enter all surfaces of rotation body into surf addr 
array, sort and fill. 

inpmous: Enter up to 25 points (maxpoint) with the left 

mouse button. These points are entered through 
save it into the point array of the rotation body. 
Enough space must be reserved in the point array 
by entering zeros here. For entering fewer than 
maxpoint points end input with the right mouse 
button. 

mouspos: Wait for mouse input, also returns after keypress. 

Therefore it checks to see which event occured. 
This GEM function must be called twice for 
unknown reasons in order to wait once for an input. 

marktype: Determines the appearance of the marker set by 
function polymarker. 

markit: Call the function polymarker to set a marker. 

setmode: Set input mode. 

save it: Stores the coordinates entered with the mouse in 

the point array of the definition line for the rotation 
body. 


296 












Abacus Software 


ST 3D Graphics 


saveit: 

switch: 

setf orm: 

coord: 

mousform: 


Stores the coordinates entered with the mouse in 
the point array of the definition line for the rotation 
body. 

Switches the logical page to the displayed page so 
that the page being drawn is the page being 
displayed. Otherwise the filling will not be seen 
and the hardcopy with <Altemate> and <Help> 
will not function either. 

Change mouse form. 

Draw a coordinate system. 

Permits the definition of a user-defined mouse 
form whose data follows after mousforl. This 
new mouse form appears after F9 is pressed and 
looks like a snail. You can change the data in the 
program according to your own taste. 


297 


ST 3D Graphics 


Abacus Software 


4.6 Handling several objects 


All subroutines discussed up to now really allow the simultaneous display 
of several objects. The only changes required are limited to the 
construction of an object definition block for each object, as well as an 
exchange of the makewrld routine. Let us consider the concrete 
example of the house from hidel. s and the changes that would be 
required, to construct a world system with two houses using the existing 
definition. 

The most promising approach appears to be to copy all of the house 
definitions (housdatx, houslin, houspla, etc.) into the 
corresponding arrays of the world system several times. The point 
coordinate arrays housdatx etc. do not present problems. They can be 
simply appended to the world system. A world system containing two 
houses would contain 52 points. More difficult is the creation of the 
world line array since the line definition of the individual objects, here 
the two houses, always starts at point offset one; the first line of every 
object starts at point 1 and runs to point 2 for the houses. If the world 
point array is extended by another house, it becomes apparent that the 
first line of the second house starts at point 27 of the world point array 
and runs to point 28, since the first 26 points belong to the first object 
The necessary procedure is simple: when constructing the line array from 
the individual object line arrays, add the total number of points in the first 
object to each line definition of the second object. Analagously, with 
three objects the sum of the points of the first two objects is added to the 
line definitions of the third object during construction of the world line 
array. 

The principle of the construction of the world line array is also used 
during construction of the world surface array, for example the first 
surface definition of the second house within the world surface array: 

4,27,28,28,29,29,30,30,27 

Furthermore, the total number of all points, lines and surfaces must be 
calculated and recorded. 

If we start with a realistic world description, the positions of the objects 
in this world system can change continuously-recall the airplane and the 
tanker truck from Section 4.1. As a consequence of this, it is necessary to 


298 









Abacus Software 


ST 3D Graphics 


objects belonging to it. The recreation is limited to the coordinate arrays 
however, since only they change. The line and surface arrays are not 
affected by the position change. The line and surface world arrays are 
created only once at the beginning of the program. The coordinate array 
is created twice in every main loop pass. 

Now to the object definition block, which contains all the information 
describing the individual object. The idea was to extend the available 
world system by one object through addition of the definition block to the 
existing blocks and incrementing the "object counter." Here for 
clarification is an object definition block in which N is replaced with the 
index of the current object: 

objectN: 

objNxda: .dc.l Address of the X-coordinate 

array of the obj. 

objNyda: .dc.l Address of the Y-coordinate 

array of the obj. 

objNzda: .dc.l Address of the Z-coordinate 

array of the obj. 

objNlin: .dc.l Address of the object line 

array 

objNpla: .dc.l Address of the object surface 

array 

objmrk: .dc.w Number of points in this 

object 

objNali: .dc.w Number of lines in this 

object 

objpln: .dc.w Number of surfaces on this 

object 

objNxO: .dc.w X-position of object in world 

system 

objNyO: .dc.w Y-position of object in world 

system 

objNzO: .dc.w Z-position of object in world 

system 

objNxw: .dc.w Rotation angle of obj. about 

X-axis 

objNyw: .dc.w Rotation angle about Y-axis 

objNzw: .dc.w Rotation angle aboutZ-axis 


299 


ST 3D Graphics 


Abacus Software 


The angles and also the position in the world system relate to the 
"rotationally neutral” point of the current object, the origin of the object 
definition coordinate system. As a whole, the block consists of 38 bytes, 
but can easily be extended with additional information, such as scale 
factors, etc. If two identical objects are to be created, you write two 
object definition blocks this is important since the creation routine finds 
the next block using the distance of 38 bytes between two blocks. Since 
two identical objects are to be created, the addresses for the two blocks 
are the same and only the position of the objects and perhaps the rotation 
angles differ. After the definition has been completed, the total number of 
objects, in this case two, is placed in the variable numob j: and now the 
total world system can be generated with a single subroutine call. 

Examine the definition blocks in the following listing of multil. s, in 
which four identical objects are already created through concatenation of 
four object definition blocks. Naturally, you are not limited to the 
creation of identical objects. You can define a new object, such as a 
church, and enter its definition array address and desired position into an 
object block. Three houses and your church will be displayed. 

Description of the new subroutines in multil. s: 


The main loop is easily changed. Here the total number of the desired 
objects, four, is passed and the new subroutines new_wrld and 
new_mark are called. 

new_wrld: The one-time call to the subroutine first creates the 
entire world system consisting of coordinate, line 
and surface arrays with corresponding parameter 
passing of the lines created, etc. Furthermore, the 
world parameters are passed to the variables of the 
link file. This assignment was previously 
performed by subroutine wrldset. 

new_mark: Change the position of an object in the world 
system this subroutine recreates the total 
coordinate system with the aid of the modified 
parameters and at the same time passes the world 
parameters to the variables of the link file. 


300 











Abacus Software 


ST 3D Graphics 


new_it:, surf_lin:, surf_arr: 

These three subroutines are called by new_wrld 
and new , mark and handle the actual creation of 
the world system from the individual object 
definitions. 

change: Change the object parameters of the individual 

objects. For simplification, modification is passed 
to all four objects. 


General comments on the program: 


Beside being able to display multiple objects, this program offers another 
novelty: two successive transformations of the same object. First, the four 
objects are "set" into the world system with new_mark: after they have 
first been rotated about three axes. After all objects have been ‘’rotated" in 
the world system you can, through control with the keyboard, rotate the 
entire system consisting of the four houses around a point in the world 
system, or move the projection plane similar to previous programs. The 
four houses of the system rotate around different axes of their 
"rotationally neutral” points at various places in the world system. The 
display on the screen occurs after the removal of the hidden lines with the 
familiar subroutine hide it:, which is used on the complete world array 
so that the four houses are not created through mirroring or something 
similar, but the hidden surfaces of all four objects are calculated in real¬ 
time. The hide it algorithm of this program does not recognize 
covering by other visible surfaces so that a house covered by other houses 
will be drawn. 

Control keys are again the cursor, help and undo keys, as well as the / * - 
+ keys on the keypad. 

The speed is quite impressive. One enhancement, besides the addition of 
user-defined objects, is the ability to change an object’s parameters in the 
subroutine change: by keyboard input, for example, and to change the 
position of single objects in the system. 


301 



ST 3D Graphics 


Abacus Software 


* multil.s 22.2.1986 * 

* Multiple objects, four houses * 

* with hidden line algorithm * 

* * 


. globl 
.globl 
.globl 
.globl 
.globl 
.globl 
.text 


main,xoffs,yoffs,zoffs,offx,offy,offz 
viewx,viewy,viewz 

wlinxy,mouse off,setrotdp,inp_chan,pointrot 
wrldx,wrldy,wrldz,gnummark,gnumline,gnumpla 
viewx,viewy,viewz,wplane 
new it,new_wrld,obj2mrk, obj2pln 


* The program starts here—called by link-file * 


main: 


mainl: 


jsr 

apinit 

* 

Announce program 

jsr 

grafhand 

* 

Get screen handle 

jsr 

openwork 

* 

Announce screen 

jsr 

mouse off 

* 

Switch off mouse 

jsr 

getreso 

* 

Screen resolution 

jsr 

setcocli 

* 

set Cohen-Sutherland clip. 

jsr 

clearbuf 



move.w 

#4,gnumobj 

* 

announce four objects 

jsr 

pageup 



jsr 

clwork 

* 

Screen resolution 

jsr 

setrotdp 

* 

initialize obs. ref. point. 

jsr 

pagedown 

* 

Display logical screen page 

jsr 

clwork 



jsr 

inp_chan 

* 

Input and change world parameters 

jsr 

change 

* 

Change object parameters 

jsr 

new_wrld 

★ 

create lines and surfaces 


302 











Abacus Software 


ST 3D Graphics 


mainlopl: 


jsr 

pointrot 

* 

rotate around observ. ref. point 

jsr 

pers 

* 

Perspective transformation 

jsr 

hideit 

* 

calculate hidden surface 

jsr 

surfdraw 

★ 

and draw 

jsr 

pageup 

★ 

Display physical screenpage 

jsr 

change 

* 

change object parameters and 

jsr 

new mark 

★ 

calculate new coordinates 

jsr 

inp chan 

* 

Input new parameters 

jsr 

clwork 

* 

erase page not displayed 

jsr 

pointrot 

★ 

Rotate around rot. ref. point 

jsr 

pers 

★ 

Transform new points 

jsr 

hideit 

* 

Calculate hidden surfaces 

jsr 

surfdraw 

* 

and draw them 

jsr 

pagedown 

* 

Display this logical page 

jsr 

change 

* 

Change object parameters 

jsr 

new mark 

★ 

Calculate new point coordinates 

jsr 

inp chan 

* 

Input and change parameters 

jsr 

clwork 

* 

erase physical page 

jmp 

mainlopl 

★ 

to main loop 

move.1 

physbase. 

logbase 

jsr 

pageup 

* 

switch to normal display page 

rts 


* 

back to link file, and end 


A********************************************************************** 

* Create the point coordinates of the world array with the * 

* information from the object parameter block (objectl) * 

*********************************************************************** 


new mark: 


move. w 

#0,offx 

move.w 

>■ 

4-1 

4-1 

0 

o 

move. w 

#0,offz 

jsr 

new it 

move.1 

#viewx,pointx 

move.1 

#viewy,pointy 

move.1 

#viewz,pointz 

move . 1 

#wrldx,datx 

move. 1 

#wrldy,daty 

mo ve. 1 

#wrldz,datz 

move.1 

#wlinxy,linxy 


303 







ST 3D Graphics 


Abacus Software 


move.w gnummark, nummark 

move.w gnumline,numline 

move.w gnumpla,numsurf 

rts 




* Change the object parameter, in this case the rotation angle 

* in the object parameter block, which is then taken into account * 

* when calculating point coordinates with rnew_mark 
********************************************************************** 


change : 


changwl: 


move. w 

objlyw,dO 

add. w 

#4, dO 

cmp.w 

#360,dO 

bit 

changwl 

sub.w 

#360,dO 

move.w 

dO,objlyw 

move.w 

dO,obj2xw 

move.w 

dO,obj3zw 

move.w 

dO,obj4xw 

move.w 

dO,obj4yw 

move.w 

rts 

dO,obj4zw 


*********************************************************************** 

* Set all world parameters for the link file variables and 

* create the point, line, and surface arrays of the world system 
*********************************************************************** 


new wrld: 


move. w 

#0, dO 

move.w 

dO,offx 

move.w 

dO,offy 

move.w 

dO,offz 

move.w 

proz,zobs 

move.w 

#0,dist 

move.1 

iscreenx,xplot 

move.1 

#screeny,yplot 

move.w 

picturex,xO 

move.w 

picturey,yO 


* Location of projection plane 

* Address of screen array 

* Screen center 







Abacus Software 


ST 3D Graphics 


jsr 

new it 

* 

Pass coordinates 

jsr 

surf lin 

* 

Pass lines 

jsr 

surf arr 

* 

Pass surfaces of 

move. w 

gnummark,nummark 

* 

all objects to world system 

move.w 

gnumline,numline 

* 

Total number of corners, lines 

move.w 

gnumpla,numsurf 

★ 

and surfaces of world system 

move.1 

#wrldx,datx 

* 

Pass parameters of world system to 

move.1 

#wrldy,daty 

* 

link file variables 

move.1 

#wrldz,datz 



move. 1 

#viewx,pointx 



move.1 

#viewy,pointy 



move.1 

#viewz,pointz 



move.1 

#wlinxy,linxy 



rts 





* Subroutine for creating the world system coordinate array * 

•ft********************************************************************** 


new it: 


new_lopl: 


move.1 

#0,mark_it 

* 

Pointer in wrldx,wrldy,wrldz 

move.w 

gnumobj,dO 

* 

Total number of objects 

ext .1 

dO 

* 

as counter 

subq.1 

#1, dO 

* 

Address of first object parameter 

move.1 

#objectl, aO 

* 

block after AO. 

move.1 

(aO),datx 

* 

Objectldatx, daty,datz, pass 

move.1 

4(aO),daty 

* 

addresses of point array of 

move.1 

8(aO),datz 

* 

first object. 

move.1 

mark_it,d7 

* 

Offset in point array 

lsl.l 

#1, d7 

* 

times two bytes per entry 

move.1 

d7,d6 



add. 1 

#wrldx,d7 

* 

equals offset in world system array 

move.1 

d7,pointx 

* 

Target of transmission 

move.1 

d6,d7 



add. 1 

#wrldy,d7 



move.1 

d7,pointy 



add. 1 

twrldz,d6 



move.1 

d6,pointz 


* Array of world coordinates 

move.w 

20(aO),nummark 

* Number of corners in the object 

move.w 

2 6{aO),xoffs 


* X-offset 

move.w 

28(aO),yoffs 


* Y-offset in the world system 

move.w 

30(aO),zoffs 


* Z-offset 


305 


ST 3D Graphics 


Abacus Software 


move.w 

32(aO),xangle 

* 

Rotation angle of object around 

move.w 

34(aO),yangle 

* 

the three coordinate axes 

move.w 

36 (aO),zangle 



movem.1 

d0-d7/a0-a6, -(a?) 


* Save registers 

jsr 

matinit 

* 

Initialize rotation matrix 

jsr 

zrotate 

* 

rotate first about the Z-axis, then 

jsr 

yrotate 

* 

around Y-axis, and finally 

jsr 

xrotate 

* 

around the X-axis (matrix). 

jsr 

rotate 

* 

rotate in world coordinate system 

movem.1 

<a7)+,d0-d7/a0-a6 


move.w 

20 (aO),d7 

★ 

Number of corners in the object 

ext. 1 

d7 



add. 1 

d7,mark_it 

★ 

as offset in point array for 

add. 1 

#38,aO 

* 

the next object 

dbra 

dO, new_lopl 

* 

repeat, until all objects 

move.1 

mark_it,d7 

★ 

have been pased. After end in 

move.w 

d7,gnummark 

* 

mark it the total number of 

rts 


it 

points in the world system 


*********************************************************************** 

* Pass all lines to world system, one-time call at * 

* program start since nothing changes in the lines 
*********************************************************************** 


surf lin: 

move.w 

gnumobj,dO 


ext. 1 

d° 


subq.1 

#1, dO 


move.1 

#objectl,aO 


move. 1 

#0,linpntr 


move. w 

#0,mark it 

sflnlopl: 

move. 1 

linpntr,d7 


lsl.l 

#2,d7 


move. 1 

d7,d6 


add. 1 

twlinxy,d7 


move.1 

d7, a2 


move. 1 

12(aO),al 


move.w 

22(aO),dl 


ext. 1 

dl 


lsl.l 

#1, dl 


subq.1 

#1, dl 


* Total of all objects 

* as counter 

* Address of first Object par. blk. 

* Pointer to line array 

* Pointer to point array 

* Line pointer times four, 

* one lines requires four 

* bytes. 

* Start address of line array, add 

* to line pointer 

* Address of line array of object 

* Number of lines in this object 

* Number of lines times two equals 

* Loop counter for word transmission 


306 















Abacus Software 


ST 3D Graphics 


sflnlop2: move.w 

(al)+ ,d7 

* 

first point of first line 

add. w 

mark it,d7 

* 

add the offsets of current 

move . w 

d7,(a2)+ 

* 

objects, and store in world line; 

dbra 

dl,sflnlop2 

* 

array, until all lines of this 

* 



object 

move.w 

20(aO),d7 

* 

Number of corners of last object 

add. w 

d7,mark it 

* 

add to corner pointer 

move. w 

22 (aO) ,d7 

★ 

Number of lines 

ext. 1 

d7 



add. 1 

d7,linpntr 

* 

Total number of lines 

add. 1 

#38,aO 

* 

Object offset, distance to next 

dbra 

dO,sflnlopl 

★ 

object. When all objects are 

* 



completed 

move. 1 

linpntr,d7 

★ 

then store total number of lines 

move.w 

d7,gnumline 

* 

in the world system and 

rts 


* 

back 




s surface 

array of the 

r*********************' 

move.w 

#0,mark_it 

move.1 

#0,plapntr 

move.w 

#0,gnumpla 

move.w 

gnumobj,dO 

ext. 1 

dO 

subq.1 

#l,d0 

move.1 

#objectl,aO 

move.1 

plapntr,d7 

add. 1 

#wplane,d7 

move.1 

d7,a2 

move. w 

24 (aO),dl 

ext .1 

dl 

subq.1 

#1, dl 

move.1 

16 (aO),al 

move.w 

(al),d2 

ext. 1 

d2 

lsl.l 

#1, d2 


* Create the array of surfaces 

* Counter of surfaces 

* Number of objects 

* as loop counter 

* Address of first object param. blk 

* Pointer to surface array 

* World surface array 

* Number of surfaces on this object 

* as loop counter 

* Address of surface array of the object 

* Number of lines of this surface 

* times four (one line = four bytes) 


307 






ST 3D Graphics 


Abacus Software 


move.1 

d2,d6 


lsl.l 

#l,d6 

* complete the mult. by 4 

addq.1 

#2,d6 

* plus 2 bytes for number of lines 

subq.1 

#l,d2 

* counter 

add. 1 

d6,plapntr 


move. w 

(al)+, (a2) + 

* Number of lines in this surface 

sfarlop3: move.w 

<al)+ , d7 

* From the object surface array 

add. w 

mark_it,d7 

* Add point offset of the object 

move.w 

d7, <a2) + 

* to world surface array 

dbra 

d2,sfarlop3 

* until all lines of this surface 

dbra 

dl,sfarlop2 

* until all surfaces on this object 

move.w 

20 (aO),d7 

* Number of corners 

add.w 

d7,mark it 

* add to point offset 

move.w 

24 (aO),d7 


add.w 

d7,gnumpla 

* add to total number 

add. 1 

#38,aO 

* Object offset to next object 

dbra 

dO, sfarlopl 

* until all objects of the world 

rts 


* and return 


* Input and change 

parameters 


******************************************************************** 

inp_chan: jsr 

inkey 

* Read keyboard, key code in 

cmp.b 

#'D',dO 


bne 

inpwait 


jsr 

scrdmp 

* make hardcopy 

inpwait: swap 

dO 

* DO , test if 

cmp.b 

#$4d,d0 

* Cursor-right 

bne 

inpl 


addq.w 

#1,ywplus 

* if yes, add one to Y-angle 

bra 

inpendl 

* increment and continue 

inpl: cmp.b 

#$4b,dO 

* Cursor-left, if yes then 

bne 

inp2 

* subtract one from Y-angle 

subq.w 

#1,ywplus 

* increment 

bra 

inpendl 



308 







Abacus Software 


ST 3D Graphics 


inp2: 

cmp .b 

#$50,dO 

* Cursor-down, if yes then 


bne 

inp3 



addq. w 

#1,xwplus 

* add one to X-angle increment 


bra 

inpendl 


inp3 : 

cmp .b 

#$48,dO 

* Cursor-up 


bne 

inp3a 



subq.w 

#1,xwplus 

* subtract one 


bra 

inpendl 


inp3a: 

cmp .b 

#$61,d0 

* Undo key 


bne 

inp3b 



subq.w 

#1,zwplus 



bra 

inpendl 


inp3b: 

cmp.b 

#$62,dO 

* Help key 


bne 

inp4 



addq ..w 

#1,zwplus 



bra 

inpendl 


inp4 : 

cmp.b 

#$4e,dO 

* plus key on the keypad 


bne 

inp5 

* if yes, subtract 25 from position 


sub. w 

#25,dist 

* projection plane (Z-coordinate) 


bra 

inpendl 


inp5: 

cmp.b 

#$4a,d0 

* minus key on the keypad 


bne 

inp6 

* 


add. w 

#25,dist 

* if yes, add 25 


bra 

inpendl 


inp6: 

cmp.b 

#$66,dO 

* times key on keypad 


bne 

inp7 

* if yes, then subtract 15 from the 

★ 



rotation 


sub.w 

#15,rotdpz 

* point Z-coordinate 


bra 

inpendl 

* Make change 

inp7: 

cmp.b 

#$65,dO 

* Division key on keypad 


bne 

inp8 



add. w 

#15,rotdpz 

* add 15 


bra 

inpendl 



inp8: 


309 



ST 3D Graphics 


Abacus Software 


inplO: 

crop -b 

#$44,dO 

* F10 pressed ? 


bne 

inpendl 



addq.1 

#4, a 7 

* if yes, jump to 


bra 

mainend 

* new input 

inpendl: 

move. w 

hyangle,dl 

* Rotation angle about Y-axis 


add. w 

ywplus,dl 

* add increment 


cmp. w 

#360,dl 

* when larger than 360, then subtract 


bge 

inpend2 



cmp. w 

#-360,dl 

* if smaller then 360, then 


ble 

inpend3 

* add 360 


bra 

inpend4 


inpend2: 

sub. w 

#360,dl 



bra 

inpend4 


inpend3: 

add.w 

#360,dl 


inpend4: 

move.w 

dl,hyangle 



move.w 

hxangle,dl 

* proceed in the same manner with 


add.w 

xwplus,dl 

* Rotation angle about the X-axis 


cmp. w 

#360,dl 



bge 

inpend5 



cmp.w 

#-360,dl 



ble 

inpend6 



bra 

inpendl 


inpend5: 

sub. w 

#360,dl 



bra 

inpend7 


inpend6: 

add.w 

#360,dl 


inpend7 : 

move.w 

dl,hxangle 



move.w 

hzangle,dl 



add.w 

zwplus, dl 



cmp.w 

#360,dl 



bge 

inpend8 



cmp.w 

#-360,dl 



ble 

inpend9 



bra 

inpendlO 


inpend8 : 

sub. w 

#360,dl 



bra 

inpendlO 


inpend9: 

add.w 

#360,dl 



310 










Abacus Software 


ST 3D Graphics 


inpendlO: move.w dl,hzangle 
rts 


****************************************************************** 

* Determine the current screen resolution * 

****************************************************************** 


getreso: 

move. w 

#4,-(a7) 



. trap 

#14 



addq.1 

#2,a7 



cmp. w 

#2, dO 



bne 

getrl 



move.w 

#320, picturex 

* Monochrome monitor 


move.w 

#200,picturey 



bra 

getrend 


getrl: 

cmp. w 

#l,d0 



bne 

getr2 



move.w 

#320,picturex 

* medium resolution (640*200) 


move.w 

#100,picturey 



bra 

getrend 


getr2: 

move.w 

#160,picturex 

* low resolution (320*200) 


move.w 

#100,picturey 


getrend: 

rts 




* Hardcopy of screen, called by inp_chan * 


scrdmp: 


move.w 
trap 
addq.1 
jsr 
rts 


#20,- (a7) 
#14 
#2,a7 
clearbuf 


311 


ST 3D Graphics 


Abacus Software 


A********************************************************************** 

* Initialize the rotation reference point to [0,0,0] * 

*********************************************************************** 


setrotdp: move.w 

#0, dl 

* set the initial rotation 

move.w 

dl,rotdpx 

* reference point 

move.w 

dl,rotdpy 


move. w 

dl,rotdpz 


move.w 

#Q,hyangle 

* initial rotation angle 

move. w 

#0,hzangle 


move.w 

#0,hxangle 


move.w 

#0,ywplus 


move. w 

#0,xwplus 


move.w 

#0,zwplus 


rts 



*******************************************************************, 

* Rotation around 

the rot. ref. 

point around all three axes 

*******************************************************************> 

pointrot: move.w 

hxangle,xangle * rotate the world around 

move.w 

hyangle,yangle 

move.w 

hzangle,zangle 

move.w 

rotdpx,dO 

* rotation ref. point 

move.w 

rotdpy,dl 


move.w 

rotdpz,d2 


move.w 

dO,xoffs 

* add for inverse transformation 

move.w 

dl,yoffs 


move.w 

d2,zoffs 


neg .w 

dO 


neg. w 

dl 


neg. w 

d2 


move.w 

dO,offx 

* subtract for transformation 

move.w 

dl,offy 


move.w 

d2,offz 


jsr 

matinit 

* matrix initialization 

jsr 

zrotate 

* rotate 'matrix' aboutZ-axis 

jsr 

yrotate 

* rotate 'matrix' about Y-axis 

jsr 

xrotate 

* then rotate around X-axis 

jsr 

rotate 

* Multiply points with the matrix 


312 













Abacus Software 


ST 3D Graphics 


********************************************************************* 

* Set the limits of screen window for the Cohen-Sutherland * 

* clip algorithm built into the draw-line algorithm * 

* The limits can be freely selected by the user, which makes the * 

* draw-line algorithm very flexible. * 

********************************************************************* 

setcocli: move.w #0,clipxule 

move.w # 0,c1ipyule 

move.w picturex,dl 

lsl.w #1,dl 

subq.w #l,dl 

move.w dl,clipxlri 

move.w picturey,dl 

lsl.w #1,dl 

subq.w #l,dl 

move.w dl,clipylri 

rts 


* Entry of visible Surfaces into the vplane array * 

********************************************************************* 

hideit: 

move.w numsurf,dO * Number of surfaces as counter 

ext.1 dO 

subq.l #l,dO 

move.1 #viewx,al * The point coordinates are stored 
move.l #viewy,a2 * here 

move.l #viewz,a3 

move.l #wplane,aC * here is the information for 

move.l #vplane,a5 * every surface 

move.w #0,surfcount * counts the known visible surfaces. 

visible: move.w (aO),dl * start with first surface. Number of 

ext.l dl * points on this surface in Dl. 

move.w 2(a0),d2 * Offset of first point on this surface 

move.w 4(a0),d3 * Offset of second point 

move.w 8(a0),d4 * Offset of third point 

subq.w #l,d2 * subtract one for access to point array 

subq.w #1,d3 * from current point offset. 


313 





ST 3D Graphics 


Abacus Software 


doitl: 


subq.w 

#l,d4 



lsl. w 

#l,d2 

★ 

continue to multiply with two 

lsl. w 

#l,d3 



lsl. w 

#1, d4 

* 

and then access current 

move.w 

(al,d3.w),dS 

★ 

point coordinates 

cmp.w 

<al,d4.w),d6 

* 

Comparison recognizes two points 

bne 

doitl 

* 

with matching coordinates, which can 

move.w 

(a2,d3.w),d6 

* 

occur during construction of rotation 

cmp. w 

(a2,d4.w),d6 

* 

bodies. When two identical points 

bne 

doitl 

* 

are found, the program 

move.w 

(a3,d4.w),d6 

* 

selects a third point for determination 

cmp. w 

(a3,d3.w),d6 

* 

of the two vectors. 

bne 

doitl 



move.w 

12(aO),d4 



subq.w 

#l,d4 



lsl. w 

#1, d4 




move.w 

(al,d3.w),d5 

* here the two vectors which lie in the 

move.w 

d5, kx 

* surface plane are determined through 

sub. w 

(al,d2.w),d5 

* subtraction of the coordinates from 

move.w 

d5,px 

* two points of the surface 

move.w 

(a2,d3.w),d5 


move.w 

d5,ky 

* The direction coordinates of the 

sub.w 

U2,d2.w) ,d5 

* vectors are stored in the variables 

move.w 

d5,py 

* qx,qy,qz and px,py,pz. 

move.w 

(a3,d3.w),d5 


move.w 

d5, kz 


sub. w 

(a3,d2.w),d5 


move.w 

d5, pz 


move.w 

(al,d4.w),d5 

* Calculate vector Q 

sub. w 

(al,d2.w),d5 


move.w 

(a2,d4.w) ,d6 


sub. w 

(a2,d2.w),d6 


move.w 

(a3,d4.w),d7 


sub. w 

(a3,d2.w),d7 


move. w 

d5,dl 

* qx 

move . w 

d6,d2 

* qy 

move. w 

d7,d3 

* qz 


314 












Abacus Software 


ST 3D Graphics 


vector 


* the 


sightl 


mu Is 

py,d3 


* Calculate of the cross product 

mu Is 

pz, d2 


* of the vector perpendicular 

sub. w 

d2,d3 


* to the current surface 

move.w 

d3, rx 



mu Is 

pz, dl 



mu Is 

px,d7 



sub. w 

d7, dl 


* the direction coordinates of the 

move.w 

dl, ry 


* standing vertically to the surface 

mu Is 

px, d6 


* are temporarily stored in rx,ry,rz 

mu Is 

py,d5 



sub. w 

d5,d6 



move.w 

d6, rz 



move.w 

prox,dl 

* 

The projection center serves as 




the comparison 

sub. w 

kx,dl 

* 

point for the visibility of a surface. 

move.w 

proy,d2 

* 

which is acceptable for the viewing 

sub. w 

ky,d2 

* 

situation chosen here. One can also 

move.w 

proz,d3 

* 

use the observation ref. point as 

sub. w 

kz, d3 

* 

comparison point. 

mu Is 

rx, dl 

* 

Now follows the comparison of vector 

muls 

ry, d2 

* 

R and the vector from one point of the 

mu Is 

rz,d3 

* 

surface to the projection center 

add.l 

dl, d2 

* 

by creation of the scalar product 

add.l 

d2,d3 

* 

of the two vectors. 

bmi 

dosight 




surface is visible, otherwise continue with next surface. 

move.w (aO),dl * Number of lines of the surface 

ext.l dl 

lsl.l #2,dl * Number of lines times 4 = space for Lines 

addq.l #2,dl * plus 2 bytes for the number of lines. 

add.l dl,aO * add to surface array for access 

: dbra dO,visible * to next surface. If all surfaces 

bra hideend * are completed, then end. 


ST 3D Graphics 


Abacus Software 


dosight: 

move. w 

ext .1 

(aO),dl * 

dl * 


move.1 

lsl.l 

move. 1 

addq.1 

dl, d2 

#1,dl * 

aO, a4 

#2,a4 * 

sight3: 

move.w 

(aO)+,(a5)+ 


dbra 

dl,sight3 


addq. w 

bra 

#1,surfcount 

sight1 

hideend: 

rts 



Number of lines in this surface, 
multiplied by two equals the 

number of words to be passed 
Access to first line of the Surface 

* Pass the number of the lines 

* and the individual lines 

* the number of surfaces plus 

* one, and work on next one 


********************************************************************* 

* Draw surfaces entered in vplane * 

********************************************************************** 


surfdraw: 

move.1 
move.1 


* draw surfaces with the count 
xplot,a4 * of surfaces passed in surfcount 

yplot,a5 


move. 1 
move.w 
ext .1 
subq.1 
bmi 

surflopl: move.w 

ext. 1 
subq.1 


#vplane,a6 * Description in array at address 
surfcount,dO * vplane, was entered by routine hideit 


dO 

#1, dO 
surfend 
(a6)+,dl 
dl 

#l,dl 


* if no surface was entered in array, 

* then end. 

* Number of lines on this surface 

* as counter of lines to be drawn. 


surflop2: move.1 


(a6)+,d5 


* first line of this surface 


subq.w #l,d5 
lsl.w #1,d5 
move.w 0 (a4,d5.w),d2 
move.w 0 (a5,d5.w),d3 
swap d5 


* Access to screen array, which contains 

* display coordinates of the 

* points. 

* extract points, pass from 

* the routine. 


316 






Abacus Software 


ST 3D Graphics 


subq. w 

#l,d5 



lsl. w 

#l,d5 



move. w 

0 (a4, d5 . w) , a2 

* 

second point belonging to the the line 

move. w 

0 (a5, d5 . w) , a3 



jsr 

drawl 

* 

draw line, until all lines of this 

dbra 

dl,surflop2 

* 

surface have been drawn and repeat 

dbra 

dO,surflopl 

* 

until all surface have been drawn. 

rt s 


* 

finally return. 


* Display and description of the same screen page * 


switch: 


move.w 

#-l,-<a7) 

move. 1 

physbase,- (a7) 

move.1 

physbase,- (a7) 

move. w 

#5,-<a7) 

trap 

#14 

add. 1 

#12,a7 

rts 



* show display page in which 

* drawing is being made 


****************************************************************** 
* remove all characters present in the keyboard buffer * 


clearbuf: 


clearnd: 


move.w 

#$b,-(a7) 

★ 

Gemdos function, character in buffer 

trap 

#1 



addq.1 

#2,a7 



tst. w 

dO 

* 

if yes, get character 

beq 

clearnd 

★ 

if no, terminate 

move. w 

#1,-(a7) 

★ 

Gemdos function CONIN 

trap 

#1 

★ 

repeat until all characters have 

addq.1 

#2,a7 

★ 

been removed from the buffer 

bra 

clearbuf 



rts 




. even 





317 



ST 3D Graphics 


Abacus Software 




• data 


housdatx: 

.dc. w 

-30,30,30,-30,30,-30,-30,30,0,0,-10,-10,10,10 


.dc.w 

30,30,30,30,30,30,30,30,30,30,30,30 

housdaty: 

.dc. w 

30,30,-30,-30,30,30,-30,-30,70,70,-30,0,0,-30 


.dc.w 

20,20,0,0,20,20,0,0 


.dc.w 

-10,-10,-30,-30 

housdatz: 

.dc.w 

60, 60, 60, 60,-60,-60,-60,-60, 60,-60,60,60, 60, 60 


• dc.w 

40,10,10,40,-10,-40,-40,-10 


.dc.w 

0,-20,-20,0 

houslin: 

.dc.w 

1,2,2,3, 3, 4,4,1,2,5,5, 8, 8,3, 8, 7,7,6, 6, 5, 6,1,7,4 


.dc.w 

9,10,1,9,9,2,5,10,6,10,11,12,12,13,13,14 


.dc.w 

15, 16, 16, 17, 17,18,18, 15, 19,20,20,21,21,22,22,19 


.dc.w 

23,24,24,25,25,26,26,23 


318 








Abacus Software 


ST 3D Graphics 


* here is the definition of the surfaces belonging to the house * 

houspla: .dc.w 4,1, 2,2,3,3, 4,4,1, 4,2,5, 5,8, 8,3, 3,2 

.dc.w 4,5,6,6,7,7,8,8,5,4,7,6,6,1,1,4,4,7 
.dc.w 4,4,3,3,8,8,7,7,4,4,2,9,9,10,10,5,5,2 
.dc.w 4,10,9,9,1,1,6,6,10,3,1,9,9,2,2,1 
.dc.w 3,5,10,10,6,6,5,4,11,12,12,13,13,14,14,11 

.dc.w 4,15,16,16,17,17,18,18,15,4,19,20,20,21,21,22,22,19 
.dc.w 4,23,24,24,25,25,26,26,23 


hnummark: 

.dc.w 

26 

* 

Number 

of corner 

■ points of the 

house 

hnumline: 

.dc.w 

32 

■* 

Number 

of lines 

of the 

house 


hnumpla: 

.dc.w 

13 

★ 

Number 

of surfaces of 

the house 


hxangle: 

.dc.w 

0 


* Rotation angle 

of house about 

X-axis 

hyangle: 

.dc.w 

0 


* 

H 

II 

II 

Y-axis 

hzangle: 

.dc.w 

0 


* 

11 

II 

M 

Z-axis 

xwplus: 

.dc.w 

0 

* 

Angle 

increment 

about 

X-axis 


ywplus: 

• dc.w 

0 

* 

Angle 

increment 

about 

Y-axis 


zwplus: 

.dc.w 

0 

* 

Angle 

increment 

about 

Z-axis 


picturex: 

.dc.w 

0 

* 

Definition of zero point on the 

screen 

picturey: 

.dc.w 

0 

★ 

entered by getreso 




rotdpx: 

.dc.w 

0 

rotdpy: 

.dc.w 

0 

rotdpz: 

. dc. w 

0 


rlzl: .dc.w 0 

normz: .dc.w 1500 


.bss 


319 


ST 3D Graphics 


Abacus Software 


plusrot: 

.ds. 1 

1 


first: 

. ds. w 

1 


second: 

.ds. w 

1 


deltal: 

.ds. w 

1 


worldpla: 

.ds. 1 

1 



.data 



plag: 

.dc .b 

1 



. even 




.bss 



diffz: 

• ds .w 

1 


dx: 

.ds .w 

1 


dy: 

.ds .w 

1 


dz: 

.ds. w 

1 


wrldx: 

.ds. w 

1600 

* world coordinate array 

wrldy: 

• ds .w 

1600 


wrldz: 

.ds .w 

1600 


viewx: 

• ds. w 

1600 

* view coordinate array 

viewy: 

.ds .w 

1600 


viewz: 

• ds. w 

1600 


screenx: 

.ds. w 

1600 

* screen soordinate array 

screeny: 

.ds. w 

1600 


wlinxy: 

.ds. 1 

3200 

* line array 


wplane: 

.ds. 1 

6600 

* surface array 

vplane: 

.ds. 1 

6600 

* surface array 


320 










Abacus Software 


ST 3D Graphics 


space: 

. ds. 1 

2 

pladress: 

.ds. 1 

3000 * 

surfcount: 

. ds. w 

1 

numsurf: 

. ds. w 

1 

zcount: 

. ds. 1 

1 * 

zsurf: 

. ds . w 

1 * 

***************************** 

.data 

gnumobj: 

.dc.w 

2 

gnummark: 

. dc. w 

0 

gnumline: 

.dc.w 

0 

gnumpla: 

.dc.w 

0 

mark_it: 

.dc. 1 

0 

linpntr: 

.dc. 1 

0 

plapntr: 

.dc. 1 

0 

objectl: 

objlxda: 

.dc. 1 

housdatx 

objlyda: 

.dc. 1 

housdaty 

objlzda: 

.dc. 1 

housdatz 

objllin: 

.dc. 1 

houslin 

objlpla: 

.dc. 1 

houspla 

objlmrk: 

.dc.w 

26 

objlali: 

.dc.w 

32 

objlpln: 

.dc.w 

13 

objlxO: 

.dc.w 

150 

objlyO: 

.dc.w 

100 

objIzO: 

.dc.w 

0 

objlxw: 

.dc.w 

20 

objlyw: 

.dc.w 

0 

objlzw: 

.dc.w 

0 

object2: 

obj2xda: 

• dc. 1 

housdatx 

obj2yda: 

.dc. 1 

housdaty 

obj2zda: 

.dc. 1 

housdatz 


* surface array 


321 


ST 3D Graphics Abacus Software 


obj21in: .dc.1 houslin 

obj2pla: .dc.l houspla 

obj2mrk: .dc.w 26 

obj2ali: .dc.w 32 

obj2pln: .dc.w 13 

obj2x0: .dc.w -150 

obj2y0: .dc.w 100 

obj2z0: .dc.w 0 

obj2xw: .dc.w 0 

obj2yw: .dc.w 20 

obj2zw: .dc.w 0 


object3: 



obj3xda: 

.dc.l 

housdatx 

obj3yda: 

.dc.l 

housdaty 

obj3zda: 

.dc.l 

housdatz 

obj31in: 

.dc.l 

houslin 

obj3pla: 

.dc.l 

houspla 

obj3mrk: 

.dc.w 

26 

obj3ali: 

.dc.w 

32 

obj3pln: 

.dc.w 

13 

obj3x0: 

.dc.w 

-150 

obj3y0: 

.dc.w 

-100 

obj 3z0: 

• dc.w 

0 

obj3xw: 

.dc.w 

0 

obj3yw: 

.dc.w 

20 

obj3zw: 

.dc.w 

0 


object4 : 
obj4xda: 

.dc.l 

housdatx 

obj4yda: 

.dc.l 

housdaty 

obj4zda: 

.dc.l 

housdatz 

obj41in: 

.dc.l 

houslin 

obj4pla: 

.dc.l 

houspla 

obj4mrk: 

.dc.w 

26 

obj4ali: 

.dc.w 

32 

obj4pln: 

.dc.w 

13 

obj 4x0: 

.dc.w 

150 

obj4y0: 

.dc.w 

-100 

obj4z0: 

.dc.w 

0 


322 







Abacus Software 


ST 3D Graphics 


obj 4xw: 

.dc. w 

0 

obj 4yw: 

.dc.w 

0 

obj4zw: 

.dc. w 

0 


.bss 



sx: 

.ds.w 

1 

sy: 

.ds.w 

1 

sz: 

.ds.w 

1 

px: 

.ds.w 

1 

py: 

.ds.w 

1 

pz: 

.ds.w 

1 

rx: 

.ds.w 

1 

ry: 

.ds.w 

1 

rz: 

-ds.w 

1 

qx: 

.ds.w 

1 

qy: 

.ds.w 

1 

qz: 

.ds.w 

1 

kx: 

.ds.w 

1 

ky: 

.ds.w 

1 

kz: 

• ds.w 

1 

********************** 

.data 

• even 

maxpoint: 

.dc. 1 

25 

mousx: 

.dc.w 

0 

mousy: 

.dc. w 

0 

mousbut: 

.dc. w 

0 

kybdstat: 

.dc.w 

0 

altx: 

.dc.w 

0 

alty: 

.dc.w 

0 

newx: 

.dc.w 

0 

newy: 

.dc.w 

0 


323 


ST 3D Graphics 


Abacus Software 


addrssx: 

.dc. 1 

1 



.data 



prox: 

.dc.w 

0 

* Coordinates of Projection 

proy: 

. dc. w 

0 

* Center on the positive 

proz: 

• dc.w 

1500 

* Z-axis 


• data 



of fx: 

.dc. w 

0 

* transformation during Rotation 

of fy: 

. dc. w 

0 

* to Point [offx,offy,offz] 

of f z: 

.dc.w 

0 


xoffs: 

.dc. w 

0 

* Inverse transformation to point 

yoffs: 

.dc.w 

0 

* [xoff,yoffs,zoffs] 

zoffs: 

.dc.w 

0 



.bss 



loopc: 

.ds. 1 

1 


.end 





Desk File View Options 


A:\ 


D:\ 


F:\3DU0RK.DIRS 


253882 butes used 1 


1442236 butes used In 129 itens, ■ 333956 bytes used In 


X PRINTERS 
8 TUTORIAL 
C 

COMV 

NLlfl 

OUTPUT 

SPLIT 

STANDARD 

TEXTPRO 

TUTORIAL 

XTTUTORI 


FRY 

TTP 

PRO 

PRG 

TTP 

PRT 

PRG 

TXT 

TOC 


BASIC 

BASIC 

BASIC 

BASIC1 


PRG 

RSC 

MRK 

BAR 


138344 11-21 
4648 11-21 
346 11-26 
14801 11-26 


OPEN APPLICATION 

Nane: BATCH .TTP 
Paraneters; . 

asllnk grllnkl miltll)- 


I OK 1 I Cancel 



HOUSE1 PRG 
HOUSE1 S 
MAIK1 PRG 
KAIN1 S 
HAIN1C0 PRG 
MAIN1C0 S 
MEKU1 PRG 
HENU1 
MULTI1 
MULTI1 
PAINT1 
PRINT1 
ROTATE1 PRG 
R0TATE1 S 


S 

PRG 

S 

PRG 

S 


1 0 a? a? 

min \trrm ■n'v.-r rrrwt j-amattfil jS33HEflB33i 


■BSffiSMI 


324 















































Abacus Software 


ST 3D Graphics 


5. Suggestions for additional development 


One application of this program module for manipulating three- 
dimensional objects that will occur to almost everyone is a flight 
simulator. The last program can in fact be used as a basis for a flight 
simulator. We are missing the description of the position of the airplane 
in the world system as well as a modified point rot routine. The 
modified point rot routine, after rotation around the reference point, 
should not transform all of the world coordinates back to the old 
coordinate origin, which occurred in the old point rot routine by 
adding the reference point coordinates after the rotation. Furthermore, 
houses do not change position in the world system of a flight simulator 
and for an airport other structures must be developed (hangar, tower). In 
addition, fields, forests, and landing strips can be simulated with simple 
rectangular surfaces. 

The position of the airplane, or to be exact, the center of its cockpit 
windshield, in the the reference point in the world system for all 
transformations to follow, especially that of the creation of the view 
system. For simulation of airplane movement, the reference point must be 
manipulated with keyboard input. This input must affect both the point 
coordinates as well as the orientation of the plane in space. The 
orientation of the airplane in space- is described with the three angles 
(hxangle,hyangle,hzangle) so that even adventurous flight 
situations (spins) can be simulated. For adjustment of the world system to 
the airplane system the following operations are required: 

1. Move the coordinate origin of the world system to the 
cockpit center by subtracting the cockpit windshield 
center-coordinates from all point coordinates. 

2. Rotate of the displaced world system about the three 
rotation angles which describe the position of the airplane 
in relation to its three axes. 


327 


ST 3D Graphics 


Abacus Software 


3. Remove hidden surfaces with hideit, noting that the 
reference point for the calculation of the vector S through 
point [0,0,0], the cockpit center-point (coordinate origin of 
the view system) is chosen and not the projection center, 
which of course can also be freely selected in this 
observation model. From the endpoint of vector S the 
direct result: all objects outside the cockpit window are, if 
they satisfy the criteria for visibility, visible. 

4. Projection on the screen through the perspective transform 
routine. 

After the observed world is displayed, the parameters such as the position 
of the airplane in the world system or the position of other objects in the 
world system, such as a second airplane, can be changed. Now the 
procedure described above is called again and this cycle repeated 
continually. 


328 








Abacus Software 


ST 3D Graphics 


5.1 Light and Shadow 


To enhance the program module to correctly define a light source, as in 
section 2.8, it is necessary to have the vectors L, i.e. the vector, which 
points from each surface to the observation reference point as well as the 
vector N, which points from the light source to the current surface, as unit 
vectors of length one. One should divide the vector coo rdinates (x, y, z) 
by the root of the sum of its squares V(x2+y2 + z 2). Furthermore, the 
data structure of the objects must be changed since you want to shade the 
surfaces according to the light intensity and not according to their Z- 
coordinates. It is possible to enter the intensity of every surface in the 
extended surfaddr array and give each surface an individual shading 
pattern, either through comparison of the light source vectors or 
completely at random. 


329 


ST 3D Graphics 


Abacus Software 


5.2 Animated Cartoons 


In principle even this application has already been realized in program 
multi. s. You simply create more objects in a world system and then 
changes their position and place in the system continuously. The world 
line and surface arrays, as we have seen, need be created only once while 
the coordinate array is created with every pass through the main loop. 
After the line surface array has been constructed, you have free choice in 
the number of displayed objects, i.e. you can define, for example, ten 
objects through object definition blocks but at the creation of the comers 
you could only actually create and display. One possible application is 
moving text where the letters are three dimensional objects. You could 
have several letters "fly" together from various directions and assemble 
them on the screen into a word. The complete word could then be rotated 
around some point. The individual letters could even be constructed with 
the mouse. 


330 






















Abacus Software 


ST 3D Graphics 


Appendix A: Number systems 


Every number, in any number system, is represented by a sequence of 
digits. This sequence may be interrupted by a decimal point. We can 
write the following for the digit sequence: 

(...a4a3a2aiao.a-ia-2a-3a-4.")b = 

+ a4*b4 + a3*b3 + a2*b2 + ai*bl + ao*bO + a-i*b _ l + ... 

Here the coefficients a-4 to a4 represent the individual digits of the 
number and b is the number base. Here is an example of the most 
commonly used number system, the decimal system: 

(3423.87)10 = 

3*103 + 4*102 + 2*101 3*100 + 8*10-1 + 7*10-2 = 

3000 + 400 + 20 + 3 + 0.8 + 0.07 = 3423.87 


Two number systems often encountered, in computer programming, are 
the binary (base 2) and the hexadecimal systems (base 16). Binary uses 
only the two numbers 0 and 1 as digits. An example: 

1110010010010= 1*212+1*211+1*210+1*27+1*24+1*21= 

4096 + 2048 + 1024 + 128 + 16 + 2 = 7314 


Numbers in the hexadecimal system with base 16 are generally indicated 
by a leading dollar sign ($). For representation of numbers in this format, 
the standard ten digits from 0 to 9 are not enough. For this reason the first 
six characters of the alphabet are added (A through F). A has the value of 
10, and F means 15. It is especially easy to convert between binary and 
hexadecimal. Four binary digits (4 bits) are grouped together, starting 
from the decimal point, to form one hexadecimal digit. 


333 


ST 3D Graphics 


Abacus Software 


The unwieldy binary number 1110010010010 becomes the hexadecimal 
number $1C92. The conversion into the Decimal system is done in the 
same manner as for the binary system. $1C92 means therefore: 

1*163 + 12*162 + 9*161 + 2*160 = 

1*4096 + 12*256 + 9*16 + 2*1 = 7314 


334 









Abacus Software 


ST 3D Graphics 


Appendix B: Analytical geometry of planes and space 


The cartesian coordinate system is defined as a system of perpendicular 
lines in which the horizontal line is designated as the X-axis (abscissa) 
and the line perpendicular to it is called the Y-axis (ordinate). The 
intersection of the two lines is the origin of the system. Now all points 
within the system can be defined unambiguously by specifying their 
coordinate values (x,y). 


A line in such a system is defined by two points which belong on the line. 
All points on the line can be ascertained with the following equation. 


y-yi 

x-xl 


y2 : yl 

x2-xl 


for (x2-xl) <> 0 


In this two point format, the expression (y2-yl)/(x2-xl) gives the slope m 
of the straight line, which simultaneously represents the tangent of the 
angle between the line and the X-axis (phi). 


335 



ST 3D Graphics 


Abacus Software 



y2-yi 

x2-xt 


Figure B.l: Line in the plane 


With the definition of the slope m as well as the axis intersection a, the 
intersection of the line with the Y-axis, we get what is called the normal 
form of the straight line equation. 

y = m*x + a 

With this equation you can calculate all points on the line by introducing 
various X values into the above equation, knowing the slope m and axis 
intersection a. 

For the middle-point of a straight line which connects two points (PI, 
P2), we can easily calculate the coordinates of this segment: 


Xm = 


xl+x2 

"T* 


Ym = 


yl+y2 

2 


336 
















Abacus Software 


ST 3D Graphics 


The two equations above are used in the Cohen-Sutherland clipping 
algorithm. 

The geometry of a plane is just a special case of the geometry of space 
and therefore the same laws apply to a straight line in space as to a 
straight line in a plane, i.e. two points are also sufficient to define a point 
in space. One difference from the plane is the Z-axis which, if one leaves 
the X and Y axis unchanged, can point in different directions. Depending 
on the direction used, this system is called a right-hand or left-hand 
system. They differ therefore only in the orientation of the Z-axis. 




Figure B.2 


An easy way to distinguish between the right- and left-hand systems as 
well as all operations within the system is possible with the aid of a screw 
(imagine simply a normal screw inside the system). The screw transfers a 
rotating motion into a movement along the rotation axis and there are 
basically two types of screws: those with left-handed threads and those 
with right-handed threads. For a complete system description, we still 
need to know how positive angles are measured and for equalization of 
both coordinate systems the following definition is agreed upon: 


337 


ST 3D Graphics 


Abacus Software 


Rotation about the: positive angle is measured: 

Z-axis from +X to +Y axis 

Y-axis from +Z to +X axis 

X-axis from +Y to +Z axis 


With the aid of this definition we can say for the system and the screw: If 
a screw is placed in such a system (in the direction of a coordinate axis) 
and the screw is turned about a positive angle (see above definition), then 
the screw moves in the direction of a positive coordinate axis. You can 
determine the position axis of a coordinate system through the definition 
of the positive angle as well as the selection of the screw, or you can 
recognize the type of an existing coordinate system. As an explanation, in 
a right-hand system the right-handed screw moves in the direction of a 
positive coordinate axis when rotated about a positive angle. On the other 
hand, a left handed screw in a left-hand system rotated about a positive 
angle will also move in the direction of positive coordinate axis. Since in 
our country, screws with right-handed threads are most common, we shall 
follow the positive rotations of a right-handed screw in a right-hand 
system. 


338 




Abacus Software 


ST 3D Graphics 




Figure B.3: Screws in a right-hand system 


339 


ST 3D Graphics 


Abacus Software 


Two points in space or in a plane are sufficient to describe a line. Under 
consideration of Z-coordinates the following relationships hold: 

y-yl = y2-y 1 z-zl _ z2-zl 

x-xl x2-xl x-xl x2-xl 


Using a parameter u, which can assume real values between -infinity and 
+infinity, all points on a line running through points Pl[xl,yl,zl] 
and P2 [x2, y2, z2 ] can be determined. For individual coordinates the 
values are: 


x = (x2-xl) * u + xl 

y = (y2-yi) * u + yl 

z = (z2-zl) * u + zl 

If we use only u real numbers between 0 and 1, all points on the line 

between PI and P2 can be calculated. The line would not run beyond PI 
and P2, but would be cut off at the two points. From the lines we get a 
vector, which has a definite direction in space. In our example it points 
from PI to P2. 

A vector is a directional line, the connecting line between two points in a 
coordinate system. The coordinates of the vector are calculated by 
subtracting the point coordinates. The vector is therefore indicated by the 
vector coordinates and its direction. The direction is shown in the 
illustration by an arrow. A vector can be moved along its axis without 
consequences for the total system, since only the length and direction are 
of significance. 


340 


Abacus Software 


ST 3D Graphics 



The vector S in Figure 6.3.4 is given by its vector coordinates 
S [sx, sy, sz] = [x2-xl,y2-yl,z2-zl] and its value, the length 
of the distance S, can be determined as follows: 

Value S = |S| = V (sx 2 + sy2 + sz2) 


A unit vector is a vector whose value is one. If you want to generate a 
unit vector to a given vector S, a vector which points in the same 
direction as S but has a value of one, the vector coordinates of the unit 
vector are I [ix,iy,iz]: 

sx sy . sz 

ix =—— iv — iz =rr:— 


Dividing the individual vector coordinates of vector S [sx,sy,sz]by 
the length of vector S results in the vector coordinates of the unit vector. 


341 







ST 3D Graphics 


Abacus Software 


Various operations can be performed on the vectors and those important 
for our purposes are: 

1 . The scalar product (A-B) 

2. The cross product (AXB) 

B.l Scalar Product 


The scalar product is the sum of the products of the individual vector 
coordinates and is important to determine angles (phi) between two 
vectors (A,B). 

A-B = ax*bx+ay*by+az*bz = | A | *| B |*cos(phi) 

A-B =V ( (ax 2 +ay 2 +az 2 ) * (bx 2 +by 2 +bz2) ) *cos (phi) 

See also Figure 2.7.5. 


B.2 Cross Product 


The cross product (AxB), in contrast to the scalar product, is not a real 
number but another vector (C). The resultant vector stands perpendicular 
to the plane between the vectors A and B and together with them forms a 
new coordinate system. The rule of the screw helps us again in the 
determining the direction of the resulting vector: 

In a right-hand system the result vector (C = [cx,cy,cz]) of the 
cross product points in the same direction in which a screw with right- 
handed threads would move from A to B when turned. The vectors A, B, 
and C form a right-hand system. Similarly for a left-hand system: if one 
turns a left-threaded screw from A to B , then C points in the direction in 
which^tfie~stxew would move. This connection can be seen easily in 
Figure 6.3.5 afad in our program is responsible for the recognition of 
visible, surfaces) 



Abacus Software 


ST 3D Graphics 



Figure B.5 

To determine the result vector C [cx,cy,cz] one proceeds as follows: 
A*B = [ ax*bz-az*by, az*bx-ax*bz, ax*by-ay*bx] 



343 



ST 3D Graphics 


Abacus Software 


Appendix C: Matrix calculations 


A matrix (m,n) is a square number system consisting of m by n numbers. 


an 

an 

an 

... am 

a2i 

a22 

a23 

... a 2 n 

a3i 

a32 

a33 

... 33n 

ami 

4m2 

Sm3 

... amn 

aik where i = 

1,2.. 

.m and k = 


---- -HIV A ulllVj Uliu U1V VIVUlUiUJ 

aik,a 2 ic,.-amk form the kth column of the matrix. If the number of columns 
is equal to the number of rows (m=n), A is called a square matrix. A few 
rules can be stated for matrix calculation. 


1. Matrices are designated with uppercase letters (A-Z). The 
individual elements of a matrix carry the corresponding 
lower case letter (a-z). 

2. The element aik is located in the ith row, kth column of 
matrix A. i is the row index and k is the column index. 

3. The matrix A(m,n) is of the type (m,n) and is defined as a 
two-dimensional matrix with m rows and n columns. 

4. Matrices with one row and any number of columns, of the 
type (l,n), are called row vectors and those of type (n,l) 
are called column vectors. 


344 








Abacus Software 


ST 3D Graphics 


C.l Adding matrices 


The addition of matrices is defined only for matrices of the same 
dimensions. Here is an example with two (3,3) matrices, A with the 
elements aik and the matrix B with the elements bik- During addition, the 
sum matrix S is created with elements sik- S=A+B. 


1 2 3 

A= 4 5 6 

7 8 9 

2 

C = A+B = 8 

14 


1 2 3 

B = 4 5 6 

7 8 9 

4 9 

10 12 

16 18 


The elements of the sum matrix result from: sik = aik + bik for i,k from 1 
to 3. The limits of the variables i and k are written in mathematical form: 
i,k = 1(1)3. The value in front of the parentheses is the start value, the 
value in the parenthesis is the increment and the last number designates 
the final value of the variables. In this example, i and k take values of one 
through three with an increment of one. These are the numbers 1,2,3. 
During matrix addition, one adds the elements which are in the same 
place in each matrix, to obtain the elements of the sum matrix S. One 
proceeds in the same manner when multiplying of matrix A with a 
constant factor f ac. The elements of the product matrix P are calculated 
by multiplying each element in A by the factor. 

pik = fac * aik i,k= 1(1)3 


345 


ST 3D Graphics 


Abacus Software 


C.2 Multiplying Matrices 


The multiplication of two matrices A and B is somewhat more complex 
than addition and has some limitations. The product of two matrices is 
only defined when the number of columns of A matches the number of 
rows in B. For two square matrices with i=k=constant, the multiplication 
is always defined. The product of two matrices A (ajj) and B (bjk) is 
defined as follows: A is a matrix of type (m,l) and B is of type (l,n), then 
the product of the matrices A and B is A*B, the result matrix P is (pik), 
whose elements are calculated in the following manner: 

pik = sum of j=l to 1 over aij*bjk 

with i - l(l)m and j = l(l)n. 


This connection can be recognized in the following example. 


A= 1 2 B= 5 6 

3 4 7 8 

C = A*B = 1*5 + 2*7 1*6+ 2*8 

3*5 + 4*7 3*6 + 4*8 

19 22 

43 50 


The result matrix P therefore contains the same number of lines as the 
multiplicand A and the same number of rows as the multiplier B. In 
regard to matrix multiplication there is a neutral element, i.e. for every 
matrix A there is a matrix N with which A can be multiplied without 
changing the original matrix. A*N=A. N is called the unit matrix and the 
elements of the diagonal are one. All others have the value zero. 
Moreover, the associative and the distributive law are valid during 
multiplication. 

A*(B*C) = (A*B)*C Associative Law 

A*(B+C) = (A*B)+(A*C) Distributive Law 


346 








Abacus Software 


ST 3D Graphics 


The commutative law does not hold for matrix multiplication. This means 
A*B is not necessarily equal to B*A. The order of the multiplication is 
not arbitrary, as you see, and must be observed. 


347 


ST 3D Graphics 


Abacus Software 


Appendix D: Bibliography 


[1] Foley James D., van Dam A., Fundamentals of Interactive 
Computer graphics, Addison Wesley Publishing Company 
(1984) 

[2] Harrington Steven, Computer Graphics, McGraw-Hill 
(1983) 

[3] Newman William M., Principles of Interactive Computer 
Graphics, McGraw-Hill (1984) 

[4] Knuth Donald E., The Art of Computer Programming 
Volume 2 Seminumerical Algorithms, Addison-Wesley 
Publishing Company (1981) 

[5] Kane Gerry, Hawkins Doug, Leventhal Lance, 68000 
Assembly Language Programming, McGraw-Hill (1981) 

[6] Bruckmann, Englisch, Gerrits, Atari ST Internals, Abacus 
Software (1986) 

[7] Szczepanowski, Gunther, Atari ST GEM Programmer’s 
Reference, Abacus Software (1986) 


348 





Abacus Software 


ST 3D Graphics 


INDEX 


3-D wire models 4 
3-D wire models 56 
68000 computer 78 


A 


Abscissa 335 
Apple Macintosh 4 
Assembler 88, 89 
Associative 346 
Axis-symmetrical objects 169 


B 


BASIC1.S 92 
Batch file 90 
Binary system. 
BIOS 88 


C 


C programming language 4 
CAD systems 3 
CAD-CAM 3 

Cartesian coordinate system 7, 108, 
249, 335 
CAT scans 3 
Clip algorithm 122 
Cohen-Sutherland clipping algorithm 
122, 337 

Color monitor 219 
Column vectors 344 
Commodore Amiga 4 


Computer animation 3, 56 
Computer science 122 
Convex polygons 57 
Coordinate arrays 299 
Coordinate origin 11 
Cray II 3,4,56 
Cross product 214, 342 


D 


Data system 117 
Decimal system 333, 334 
Definition block 298-300 
Definition line 169, 189 
Desktop 296 
Digital Research 88 
Direction Binary number 334 
Display coordinate system 7 
Display of reveral objects 298 
Distributive law 346 
Draw-line-algorithm 107 


E 


Extended coordinate system 31 
Extended-BIOS 88 


G 


GEM functions 88 
GEM-DOS 88 
Global variables 152 
GRLINK1.S 123 


349 


ST 3D Graphics 


Abacus Software 


H 


Harddisk 4 

Hexadecimal number 334 
Hexadecimal system 333 
Hidden lines 4, 248, 249, 301 
Hidden surfaces 217, 301 
HIDE1.S 198 
HOUSE1.S 155 


I 


Indirect illumination 69 
Inverse transformation matrices 41 


L 


Left coordinate system 30, 34,47,48, 

59, 64, 337, 338, 342 

Line array 298 

Link file 170 

Linking programs 89 


M-N 


Machine language 4, 89 
Matrices 344 
Matrix addition 345 
Matrix multiplication 119,346 
MENUl.S 257 
Metacombco Editor 107 
Monochrome monitors 219 
Motorola MC68000 3-4 
MULTII.S 302 
Normal vector 116 


O 


Object definition block 299-300 
Object definition coordinate system 
300 

Observation coordinate system 44 
Observation direction point (ODP) 43, 
44,116,216 

Observation reference point (ORP) 43, 
44,46 

Observation window 43 
Observer system 118 
Operating system 30, 34,107,218, 

248 

Ordinate 335 


P 


PAINT1.S 221 
Pascal 4 

Perspective transformation 31,119, 
122 

Picture coordinate system 8-9 
Plot-point routine 80 
Point coordinate arrays 298 
Point light sources 70 
Polygon 11 
Polymarker 296 
Projection 38,51 

Projection center 50,116,167, 214 
Projection plane 50, 51, 56 


R 


Real time 3-D graphics 191 
Reflection coefficient 69,71 
RELMOD 88 


350 



Abacus Software 


ST 3D Graphics 


Relocator 89 

Right coordinate systems 64,122,214, 
337, 338, 342 
ROTATEl.S 172 
Rotating definition line 170 
Rotation 16, 32, 35, 37,41 
Rotation body 170,188,296 
Rotation line 170,249 
Rotation matrices 42,191 
Rotation reference point 167 
Row vectors 344 


S 


Scalar product 214, 342 
Scaling 10, 12 
Scaling matrix 32 
Scan line algorithm 56 
Screen memory 79 
Screen pages 87 
Screen switch routine 122 
Screen system 118 
Shading routine 218,248 
Shading surfaces 248 
Sine table 78 
Size manipulation 120 
Slope 81,335,336 
Square matrix 344 
Straight line equation. 336 
Structogram 246 
Surface normal vector 216 
Surface world arrays 299 


T 


Unit vector 341 
USA Today 3 
User-defined objects 301 
vectors 38, 340 

View coordinate system 8,11,15,43, 
116,118,119, 122,214 
Visible surfaces 296 


W 


Window size 165 
Wire model mode 249 
World array 298, 301 
World coordinate system 8, 11,15,44, 
109,116,117,119, 120,121,122,165, 
188,217,246,298, 299, 300, 301 
World parameters 300 
World surface array 298 


Taylor series 76 
Transformations 31,121 
Unit matrix 346 


351 


Optional Diskette 



For your convenience, the program listings contained in this book are 
available on an SF354 formatted floppy disk. You should order the diskette 
if you want to use the programs, but don’t want to type them in from the 
listings in the book. 


All programs on the diskette have been fully tested. You can change the 
programs for your particular needs. The diskette is available for $14.95 plus 
$2.00 ($5.00 foreign) for postage and handling. 


When ordering, please give your name and shipping address. Enclose a 
check, money order or credit card information. Mail your order to: 


Abacus Software 
P.O. Box 7219 
Grand Rapids, MI 49510 


Or for fast service, call 1- 616 / 241-5510. 













AA Rated Software 

Atari and Abacus 



A simple-to-use and versatile database 
manager. Features help screens; 
lightning-fast operation; tailorable 
display using multiple fonts; 
user-definable edit masks; capacity up 
to 64,000 records. Supports multiple 
files. RAM-disk support for 1040ST. 
Complete search, sort and file 
subsetting. Interfaces to TextPro. Easy 
printer control. $49.95 



ST TextPro 

Wordprocessor with professional 
features and easy-to-use! Full-screen 
editing with mouse or keyboard 
shortcuts. High speed input, scrolling 
and editing; sideways printing; 
multi-column output; flexible printer 
installation; automatic index and table 
of contents; up to 180 chars/line; 30 
definable function keys; metafile 
output; much more. $49.95 


PaintPro 

^ /*V ^ 


C. Create double¬ 
sized pictures 



Fohrq ^- 


PaintPr 


> 

Multiple J 
windows 

For creative illustrations on the ST 

r 


ST PaintPro 

A GEM™ among ST drawing programs. 
Very friendly, but very powerful design 
and painting program, A must for 
everyone's artistic or graphics needs. 
Use up to three windows. You can 
even cut S paste between windows. 
Free-form sketching; lines, circles, 
ellipses, boxes, text, fill, copy, move, 
zoom, spray, paint, erase, undo, help. 
Double-sized picture format. $49.95 



ST Forth/MT 


Powerful, multi-tasking Forth for the ST. 
A complete, 32-bit implementation 
based on Forth-83 standard. Develop¬ 
ment aids: full screen editor, monitor, 
macro assembler. 1500+ word library. 
TOS/LINEA commands. Floating point 
and complex arithmetic. $49.95 


AssemPro 

The complete 68000 
assembler development 
package for the ST 


PCBoard 

Designer 

Create printed circuit board layouts 

^ 


wuMmfimmWiiWilsmm 

Auto routing, component list, pinout list, net list 


ST AssemPro PCBoard Designer 

Professional developer's package Interactive, computer aided design 
includes editor, two-pass interactive package that automates layout of printed 
assembler wrth error locator, online help circuit boards. Auto-routing, 45° or 
including instruction address mode and 90° traces; two-sided boards; pin-to-pin, 
GEM parameter information, pin-to-BUS or BUS-to-BUS. Rubber- 
monitor-debugger, disassembler and banding of components during place- 
68020 simulator, more. $59.95 ment. Outputs pinout, component and 

net list. $395.00 


Call now for the name of the dealer nearest you. 
Or order directly using your MC, Visa or Amex 
card. Add $4.00 per order for shipping. Foreign 
orders add $10.00 per item. Call ( 616 ) 241-5510 
or write for your free catalog. 30-day money 
back software guarantee. Dealers inquires 
welcome-over 1400 dealers nationwide. 


ST and 1040ST are trademarks ot Atari Corp. 
GEM is a trademark at Digital Research Inc. 


Abacus 


mi 


P.0. Box 7219 Dept.NB Grand Rapids, Ml 49510 
Phone 616/241 -5510 • Telex 709-101 • Fax 616/241-5021 











PRESENTING THE ST 
Gives you an indnpth look at 
thla • •nietlonal n.w 
computsr. Discuss as tha 
aichltactura ot tha ST. work¬ 
ing with GEM. tha mouaa. 
operating system, all tha 
varioua intarfaoaa, tha 68000 
chip and Ita inetructlons. 
LOGO 290 pp *16 86 


ST Beginner's Oulda 
Writtan tor tha Srtthand ST 
user Gat a baalc undaratand- 
ing ol your ST Explora 
LOGO and BASIC from tha 
ground up Simpla explan 
atlona o' tha hardware and 
Intarnal workings o' tha ST 
llluatratona. diagrams Gloaa- 
ary indax. 200pp $i« 95 


ST INTERNALS 
Eaaantlal guida to tha Insida 
Inlormation ol tha ST 
Datailad daacrlptlona ol 
■ound and graphica chips. 
Intarnal hardware, I/O porta, 
ualng GEM Commented 
BIOS Hating. An Indiapan 
aibla ralaranea lor your ST 

library «0pp »'«» 


OEM ProgrammeCe Rat. 
For aarioua programmara 
naadlng detailed nlctmation 
on GEM Praaantad in an 
oony-to-undoratand format. 
All aiamplaa ara In C and 
aaaamBty language Covara 
VOI and AES function# No 
aarioua programar ahould ba 
without dIOpp SI 9 99 


MACHINE LANGUAGE 
Program In tha lastaat lang¬ 
uaga lor your ATARI ST 
Laarn 68000 Meernbly lang. 
uaga. ita numbanng ayatam, 
uaa cd raglatara. atructura S 
Important datarla of Inatruc- 
tion aat, and uaa ol intarnal 
ayatam routines Gaarad lot 
tha ST 280pp *19 95 


Fantaatlc collection ol pro- 
grama and Into lor tha ST 
Complata programa Induda. 
euperlast RAM dtak; lima- 
aadng prlntar apoolar, color 
print hardcopy plotter output 
hardcopy, craating access 
orlaa Monay aavlng tricks 
andtipa 2S0cc *19 99 



ST GRAPHICS 4SOUNO 
Datailad guida to graphica 
and aound on tha ST. 20 6 
3D kjnctlon ptottara. Molr* 
patlarna, graphic memory 
and varioua reaolutiona. 
(ractala, recursion waveform 
generation Eianpiet written 
In C, LOGO. BASIC and 
ModMe2 250pp 519 99 


ST LOGO OUIOE 
Taka contd of your ST by 
learning ST LOGO—tha aaay 
to uaa. powerful languaga 
Topic* Induda 61a handling, 
recurslon-HHbert A Sierpinskl 
curvaa. 2D and 30 (unction 
plots, data atructura. error 
handling Helpful guide lor 
ST LOGO users. *19.99 


ST PEEKS * POKES 
Enhance your programa with 
tha aiamplaa found within 
thla booh Explorea ualng 
different languages BASIC. 
C. LOGO and machine 
languaga. using various 
intarlacaa. memory uaaga, 
reading and saving horn and 
todlak, more 280pp $16 95 


BASIC Training Guide 
Thorough guida lor Isarning 
ST BASIC programming. 
Detaled programming funda¬ 
mentals, commands descilp- 
tiona. ST graphics 8 aound. 
using GEM in BASIC, lila 
management, disk operation. 
Tutorial problems give hand* 
on experience. 300pp $16 95 


BASIC to C 

Move up from BASIC to C. If 
you're elreedy a BASIC 
programmer, you can laarn C 
all that much Merer Parallel 
examples demoslrate tha 
programing techniques and 
constucts In both languages. 
Variables pointers, arrays, 
daU atructura 290pp*19 99 


30 GRAPHICS 
FANTASTICI Rotate, zoom, 
and shade 3D objects. All 
programa written In machine 
language (or high speed. 
Learn the mathematics 
behind 3D graphica. Hidden 
line removal, shading With 
3D pattern maker and 
animator. $2* 96 


The ATARI logo and ATARI ST era Swdamerkaof Alan Carp. 


Abacusiuiiiiiiil Software 


P.0. Box 7219 Dept. A9 Grand Rapids, Ml 49510 • Telex 709-101 ■ Phone (616) 241-5510 

Optional diskettes are available tor all book titles at $14.95 

Call now for the name of your nearest dealer. Or order directly from ABACUS with your MasterCard, VISA, or Amex card. Add 
$4.00 per order for postage and handling. Foreign add $10.00 per book. Other software and books coming soon. Call or 
write for your free catalog. Dealer inquiries welcome-over 1400 dealers nationwide. 






















M 

n 

V 

\ 

1 

Q> $&></■> 

O ° < 



D o / O 


3 

L> ^ 1 1 


T 

C> / 150 


j 

0 / D ) 


l 

0 1 1 0 


1 

o n\ 


$ 

j C?D O 


°1 

h 

I OO) 

tp 

\ o / -o 

( 1 

c 

l J II 

'X 

& 

! ! ?£> 

IX 

X3 

1 / of 

iV 

£ 

j l t V 

/f 

f 

in/ 




FANTASTIC! Learn how to create impressive and fascinating 3D 
graphics on the Atari ST. Covers introductory concepts and 
background materials, graphic animation, using the assembler 
and much more. Learn real-time animation with dozens of 
graphic routines. 3D Graphics is an amazing book for all 
programmers interested in advanced level graphics. Some of 
the areas covered include: 

• 2D & 3D Transformations • Spatial projection 

• Hidden lines & surfaces • Screen manipulation 

• Data structure for 3D objects • Rotation of objects 

• Object animation • Light and shadows 

About the author: 

Uwe Braun is a member of the Data Becker Product 
Development team, based in Duesseldorf, W. Germany. He is a 
knowledgeable machine language programmer with extensive 
graphics programming experience. 


isbn o-nibMai-bn-D 


The ATARI logo and ATARI ST are trademarks of Atari Corp. 


A Data Becker book published by 

a I You Can 0n ImiHHiixil e + 

Abacus \mm Software 

P.0. Box 7219 Grand Rapids. Ml 49510 - Telex 709-101 - Phone 616/241-5510